1. 程式人生 > >Android子執行緒給主執行緒傳送訊息

Android子執行緒給主執行緒傳送訊息

Android執行緒機制和Java幾乎一樣,基本用法還是有兩種

  1. 新建一個類繼承Thread類
  2. 實現Runnable介面的方式定義一個執行緒
    兩種方法都需要覆寫run方法,並用start方法啟動

1.new MyTread().start();
2.new Thread(myThread).start();Thread的建構函式接收一個runnable引數,new出的 MyThread正是一個實現Runnable的物件
3還可以使用匿名內部類的方法
new Thread(new Runnable){
@Overrivd
public void run(){
//處理具體的邏輯
}
}
子執行緒給主執行緒傳送訊息


注意:這時不需要建立Looper,呼叫的是主執行緒的handler,主執行緒會自動呼叫Looper。

package com.example.mythread;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import
android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mButton, mButton1; private TextView textView; private TextView textView1; //聲明當前時間類 注意時間類的兩種格式 private
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd,hh-mm-ss"); // private String time; //Handler處理機制 是用來處理訊息的 private Handler handler = new Handler() { //Handler裡的handMessage方法 public void handleMessage(Message msg) { //通過switch裡的msg.what欄位來判斷傳來的訊息 switch (msg.what){ case 1: String time= (String) msg.obj; textView.setText(time); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.btn); mButton1 = (Button) findViewById(R.id.btn2); textView = (TextView) findViewById(R.id.text); mButton.setOnClickListener(this); mButton1.setOnClickListener(this); } //Button的點選事件 @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn: //注意這裡,必須new一個Thread類,否則資料不更新 new Thread() { //覆寫Run方法 @Override public void run() { //要用一個while循壞 while (true) { //更新時間 String time = format.format(new Date()); Message msg = handler.obtainMessage(); msg.obj = time; msg.what = 1; handler.sendMessage(msg); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); break; case R.id.btn2: //剛開始這個地方執行的時候沒錯,但是在模擬器上顯示的時間不更新 //出現的錯誤:忘了把它放到Thread類裡 // new Thread(){ @Override public void run() { // while (true) { handler.postDelayed(new Runnable() { @Override public void run() { Log.d("正在執行的執行緒123",Thread.currentThread().getName()); String time = format.format(new Date()); textView.setText(time); } }, 1000); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); break; } } class MyThread extends Thread { } }