Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...
? ? ? ? ?先看簡單示例:點擊按鈕,2s之后,TextView改變內容。
package cn.lixyz.handlertest;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.TextView;/*** 實現點擊按鈕,開始播放幻燈片,每張幻燈片間隔2s。*/public class MainActivity extends Activity {private TextView textView;private Button button;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);Message message = handler.obtainMessage();message.obj = "更改后的內容";handler.sendMessage(message);} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;textView.setText(str);}} } MainActivity.java <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="30dp"android:text="原來的內容"android:textSize="30dp" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="BUTTON" /></LinearLayout> activity_main.xml? ? ? ? ?運行結果:
?
通過Handler實現線程間通信
???????? 解釋一下上面的代碼:
???????? 1. 在onCreate中創建自定義的Handler對象
???????? 2. 設置按鈕的點擊監聽事件,點擊按鈕之后,會啟動一個線程
???????? 3. 線程啟動之后,會先休眠2s,然后Handler對象會獲取一個Message,設置Message的obj屬性為“更改后的內容”,然后將Message發送出去
???????? 4. 在我們自定義的Handler類中,實現了handleMessage方法,在這個方法中,我們接收到message,然后將message中的obj取出,更新TextView。
???????? 再一個例子:
package cn.lixyz.handlertest;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;/*** 實現點擊按鈕,開始播放幻燈片,每張幻燈片間隔2s。*/public class MainActivity extends Activity {private EditText editText;private Button button;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText = (EditText) findViewById(R.id.editText);button = (Button) findViewById(R.id.button);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);String str = editText.getText().toString();Message message = handler.obtainMessage();message.obj = str;handler.sendMessage(message);} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;Log.d("TTTT", "接收到的消息是" + str);}} } MainActivity.java <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:hint="輸入要傳送的內容"android:padding="30dp" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="BUTTON" /></LinearLayout> activity_main.xml? ? ? ? ?運行結果:
?
在子線程中發送,在主線程中接收,在子線程中處理,在主線程中更新
???????? 再稍微處理一下上面的代碼,我們看一下他們的線程名:
package cn.lixyz.handlertest;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;/*** 實現點擊按鈕,開始播放幻燈片,每張幻燈片間隔2s。*/public class MainActivity extends Activity {private TextView textView;private Button button;private Handler handler;private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.textView);button = (Button) findViewById(R.id.button);editText = (EditText) findViewById(R.id.editText);handler = new MyHandler();button.setOnClickListener(new MyOnClickListener());}class MyOnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {Thread t = new MyThread();t.start();}}class MyThread extends Thread {@Overridepublic void run() {super.run();try {Thread.sleep(2 * 1000);String str = "****" + editText.getText().toString() + "****";Message message = handler.obtainMessage();message.obj = str;handler.sendMessage(message);Log.d("TTTT", "這里是發送消息的線程,發送的內容是:" + str + " 線程名是:" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}}}class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);String str = (String) msg.obj;textView.setText(str);Log.d("TTTT", "這里是更改UI的線程,接收到的內容是:" + str + " 線程名是:" + Thread.currentThread().getName());}} } MainActivity.java <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:padding="30dp"android:text="原來的內容"android:textSize="30dp" /><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="輸入要改變的文字" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="30dp"android:text="Send" /></LinearLayout> activity_main.xml? ? ? ? ?運行結果:
? ? ? ? ?從運行結果我們可以看到,發送消息的線程是一個WorkerThread,更新UI的線程是一個MainThread,這樣就解決了主線程和子線程之間的通信問題,我們可以在子線程中將數據處理完成之后回傳給UI線程,讓UI線程去更新UI組件。
?
轉載于:https://www.cnblogs.com/xs104/p/4815073.html
總結
以上是生活随笔為你收集整理的Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电饭锅能熏肉吗?干烧会不会弄坏电饭锅
- 下一篇: 干毛豆怎样炒更 酥脆?