Handler实现线程间的通信1
通过Handler实现线程间的通信,在主线程当中实现Handler的handlerMessage()方法,在WorkerThread中通过Handler发送消息
Handler实现线程间的通信实例:
实现点击发送消息,启动一个线程,然后让线程休眠2秒钟,把TextView中的内容修改掉
这个例子的实际价值:当点击按钮的时候,程序假设去访问服务器,服务器接收到请求之后返回结果,假设这个结果是个字符串,然后把字符串更新到TextView中
MainActivity.java
1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.os.Handler; 4 import android.os.Message; 5 import android.view.View; 6 import android.view.View.OnClickListener; 7 import android.widget.Button; 8 import android.widget.TextView; 9 10 public class MainActivity extends Activity { 11 private TextView textView; 12 private Button button; 13 private Handler handler; 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 textView = (TextView) findViewById(R.id.textViewId); 19 button = (Button) findViewById(R.id.buttonId); 20 21 handler = new MyHandler(); 22 23 button.setOnClickListener(new ButtonListener()); 24 } 25 26 //程序运行路线第三步:然后调用handler对象的handleMessage方法把消息对象传进来,然后执行这个方法中的内容 27 class MyHandler extends Handler{ 28 public void handleMessage(Message msg){ 29 30 System.out.println("handleMessage---->"+Thread.currentThread().getName()); 31 32 String s = (String)msg.obj; 33 34 //在主线程中就可以随意的操作textView(UI)了 35 textView.setText(s); 36 } 37 } 38 39 //程序运行路线第一步:当点击这个Button按钮的时候执行Oclick方法,生成了一个新的线程对象,然后让线程运行, 40 class ButtonListener implements OnClickListener{ 41 @Override 42 public void onClick(View v) { 43 Thread t = new NetworkThread(); 44 t.start(); 45 } 46 47 } 48 49 //程序运行路线第二步:执行输出代码,然后使用handler的obtainMessage()方法获取了一个Message对象,然后使用handler调用sendMessage方法将消息对象发送到消息队列中,Looper将消息对象取出来 50 class NetworkThread extends Thread{ 51 public void run(){ 52 53 System.out.println("network---->"+Thread.currentThread().getName()); 54 55 try { 56 Thread.sleep(2*1000);//模拟访问网络,所以当线程运行时,首先休眠2秒钟 57 } catch (InterruptedException e) { 58 e.printStackTrace(); 59 } 60 //把变量s的值,模拟从网络当中获取的数据 61 String s = "从网络当中获取的数据"; 62 //textView.setTag(s);这样做不行,因为在Android系统当中,只有Main线程才可以操作UI,WorkerThread线程不可以操作UI,这样操作会报异常 63 64 Message msg = handler.obtainMessage(); 65 msg.obj = s;//将s变量赋值给msg,然后发送出去,注意这里是obj属性接受的是Object类型的数据,what属性接受的是int类型 66 67 handler.sendMessage(msg);//sendMessage()方法,无论是在主线程中发送还是在WorkerThread线程中发送都是可以的,一样可以被handleMessage()方法接收 68 } 69 } 70 71 72 }
activity_main.xml
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" > 10 11 <TextView 12 android:id="@+id/textViewId" 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:text="数据" 16 17 /> 18 19 <Button 20 android:id="@+id/buttonId" 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:layout_below="@id/textViewId" 24 android:text="发送消息" 25 /> 26 27 </RelativeLayout>