Android子執行緒給主執行緒傳送訊息
阿新 • • 發佈:2019-01-22
Android執行緒機制和Java幾乎一樣,基本用法還是有兩種
- 新建一個類繼承Thread類
- 實現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 {
}
}