Android 多執行緒之間的通訊互動(Ui執行緒與子執行緒之間的通訊)Handler,Handler.post(Runnable runnable),runUiThread方式
阿新 • • 發佈:2019-02-12
工作內容:
1.FrameLayout/OnTouchListener(滑動監聽)
2.生命週期
3.UI執行緒
4.Android中的耗時操作/多執行緒
5.多執行緒中的互動:Handler handler.post(Runnable runnable)
6.多執行緒中的互動:runOnUiThread(Runnable runnable)
一、FrameLayout貞佈局:裡面放置的內容,可以一層一層的顯示,先放後顯示(在該佈局物件上新增事件監聽,當觸發事件時,可以一層一層的設定其可見性【其他佈局不可以】)
二、生命週期:onCreate → onStart/onRestart → onResume → 執行狀態(顯示在最前面) →onPause→onStop
→onDestroy
在生命週期中,程式按上列順序進入 執行狀態,當活動失去焦點,則進入onPause,當活動長時間失去焦點,則進入onStop,可能會被系統回收資源,銷燬活動。
三、Ui執行緒:主要工作是對介面(UI)進行更新和維護,執行緒不能進行耗時的操作,如果進行了超過5秒的操作可能引起提示框:提示是否繼續等待
四、多執行緒中的互動:Handler
Handler :可以傳送Message,和接收Message【通過message.what = 0來設定message的型別】
Message:可以放置 Bundle【用於傳送基本資料型別,String和實現了Serizlizable介面的應用型別】
例項1:【可以看到我將子執行緒中的資料通過handler傳送到了handMessage方法中——這樣就完成了一個子執行緒與主執行緒之間的通訊】
例項2:使用Handler.post(Runnable runnable)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(); } }
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();