Handler实现线程间的通信1

时间:2024-11-18 21:05:55

通过Handler实现线程间的通信,在主线程当中实现Handler的handlerMessage()方法,在WorkerThread中通过Handler发送消息

Handler实现线程间的通信实例:

    实现点击发送消息,启动一个线程,然后让线程休眠2秒钟,把TextView中的内容修改掉
    这个例子的实际价值:当点击按钮的时候,程序假设去访问服务器,服务器接收到请求之后返回结果,假设这个结果是个字符串,然后把字符串更新到TextView中

MainActivity.java

 import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView textView;
private Button button;
private Handler handler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textViewId);
button = (Button) findViewById(R.id.buttonId); handler = new MyHandler(); button.setOnClickListener(new ButtonListener());
} //程序运行路线第三步:然后调用handler对象的handleMessage方法把消息对象传进来,然后执行这个方法中的内容
class MyHandler extends Handler{
public void handleMessage(Message msg){ System.out.println("handleMessage---->"+Thread.currentThread().getName()); String s = (String)msg.obj; //在主线程中就可以随意的操作textView(UI)了
textView.setText(s);
}
} //程序运行路线第一步:当点击这个Button按钮的时候执行Oclick方法,生成了一个新的线程对象,然后让线程运行,
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
Thread t = new NetworkThread();
t.start();
} } //程序运行路线第二步:执行输出代码,然后使用handler的obtainMessage()方法获取了一个Message对象,然后使用handler调用sendMessage方法将消息对象发送到消息队列中,Looper将消息对象取出来
class NetworkThread extends Thread{
public void run(){ System.out.println("network---->"+Thread.currentThread().getName()); try {
Thread.sleep(2*1000);//模拟访问网络,所以当线程运行时,首先休眠2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
//把变量s的值,模拟从网络当中获取的数据
String s = "从网络当中获取的数据";
//textView.setTag(s);这样做不行,因为在Android系统当中,只有Main线程才可以操作UI,WorkerThread线程不可以操作UI,这样操作会报异常 Message msg = handler.obtainMessage();
msg.obj = s;//将s变量赋值给msg,然后发送出去,注意这里是obj属性接受的是Object类型的数据,what属性接受的是int类型 handler.sendMessage(msg);//sendMessage()方法,无论是在主线程中发送还是在WorkerThread线程中发送都是可以的,一样可以被handleMessage()方法接收
}
} }

activity_main.xml

 <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textViewId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据" /> <Button
android:id="@+id/buttonId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/textViewId"
android:text="发送消息"
/> </RelativeLayout>