1. 程式人生 > >Android 多執行緒之間的通訊互動(Ui執行緒與子執行緒之間的通訊)Handler,Handler.post(Runnable runnable),runUiThread方式

Android 多執行緒之間的通訊互動(Ui執行緒與子執行緒之間的通訊)Handler,Handler.post(Runnable runnable),runUiThread方式

工作內容:

1.FrameLayout/OnTouchListener(滑動監聽)

2.生命週期

3.UI執行緒

4.Android中的耗時操作/多執行緒

5.多執行緒中的互動:Handler handler.post(Runnable runnable)

6.多執行緒中的互動:runOnUiThread(Runnable runnable)

學習分享:

一、FrameLayout貞佈局:裡面放置的內容,可以一層一層的顯示,先放後顯示(在該佈局物件上新增事件監聽,當觸發事件時,可以一層一層的設定其可見性【其他佈局不可以】)

二、生命週期:onCreate → onStart/onRestart  →  

onResume  → 執行狀態(顯示在最前面) →onPauseonStop  onDestroy


在生命週期中,程式按上列順序進入 執行狀態,當活動失去焦點,則進入onPause,當活動長時間失去焦點,則進入onStop,可能會被系統回收資源,銷燬活動。

三、Ui執行緒:主要工作是對介面(UI)進行更新和維護,執行緒不能進行耗時的操作,如果進行了超過5秒的操作可能引起提示框:提示是否繼續等待


四、多執行緒中的互動:Handler

Handler :可以傳送Message,和接收Message【通過message.what = 0來設定message的型別】

Message:可以放置

Bundle【用於傳送基本資料型別,String和實現了Serizlizable介面的應用型別】

例項1:【可以看到我將子執行緒中的資料通過handler傳送到了handMessage方法中——這樣就完成了一個子執行緒與主執行緒之間的通訊】

import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

//在onCreate()方法中新增一條執行緒(子執行緒傳遞一個list到UI執行緒)
public class MainActivity extends Activity {
    private Button btn_join;
    private ArrayList<String> userList;
    Message message =new Message();
    Message message1 =new Message();
    private int temp = 0;
    Bundle bundle1 =new Bundle();
    Handler handler =new Handler(){
        //接收handler發過來的訊息
        @Override
        public void handleMessage(Message msg) {
            message1 = msg;
            switch (msg.what) {
                case 1://接收message.what==1的訊息
                    btn_join.setText(temp+"");
                    break;
                default:
                    break;
            }
        };
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_join = (Button)findViewById(R.id.button1);
        btn_join.setOnClickListener(new View.OnClickListener() {
            /**
             * 1.將實現Serializable的類User新增到ArrayList<User>的物件userList中
             * 2.intent.putExtra("Users",userList);傳遞
             */
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this,Secound.class);
                Bundle bundle = new Bundle();
                intent.putExtra("Users",userList);
                startActivity(intent);
            }
        });
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 1;i<=10;i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    bundle1.putSerializable("user",userList);
                    message.setData(bundle1);//傳送bundle
                    message.setTarget(handler);
                    message.what = 1;
                    handler.sendMessage(message);
                    temp++;
                }
            }
        }).start();
    }
}
例項2:使用Handler.post(Runnable runnable)
final Handler handler1 = new Handler();
        new Thread(){//開啟子執行緒
            @Override
            public void run() {
                //子執行緒中執行
                handler1.post(new Runnable() {
                    @Override
                    public void run() {
                        //執行Ui執行緒
                    }
                });
            }
        }.start();
例項3:使用runUiThread(Runnable runnable)
new Thread(){
            @Override
            public void run() {
                //子執行緒中執行
               runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                       //Ui執行緒中執行
                   }
               });
            }
        }.start();