Handler、Looper、MessageQueue(二)

来源:互联网 发布:java textfile类 编辑:程序博客网 时间:2024/05/23 01:12

Main Thread和Worker Thread间的通信
(这里涉及到的是 Worker Thread—>Main Thread)
依靠的是 Handler MessageQueue Looper的信息处理/传递 机制
在Worker Thread中进行耗费时间容易造成阻塞的操作
这里是指联网获得信息 通过Handler将信息发送给MessageQueue
Looper将信息从MessageQueue中取下 交给Handler
Handler调用handleMessage(Message msg)对信息进行处理
这里 handleMessage(Message msg)是在主线程中调用的
这样 就实现了从 Worker Thread中发送信息 到Main Thread中获得信息的过程 实现了Worker Thread—>Main Thread 的单向通信
我们可以将在Worker Thread中计算/获得的数据 通过赋值给信息对象的属性
从而达到数据传递 的目的

以下是具体的 代码操作:

<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:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">    <TextView        android:text="data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/textViewId"        android:gravity="center"/>    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/buttonId"        android:layout_below="@id/textViewId"        android:text="发送信息"/></RelativeLayout>
public class MainActivity extends Activity {    private Button button;    private TextView textView;    private NetWorkHandler netWorkHandler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button = (Button)findViewById(R.id.buttonId);        textView = (TextView)findViewById(R.id.textViewId);        ButtonListener buttonListener = new ButtonListener();        netWorkHandler = new NetWorkHandler();        button.setOnClickListener(buttonListener);    }    class ButtonListener implements View.OnClickListener{        @Override        public void onClick(View v) {            NetWorkThread netWorkThread = new NetWorkThread();            netWorkThread.start();        }    }    class NetWorkThread extends Thread{        @Override        public void run(){            //输出语句 用来证明当前执行线程为Worker Thread            System.out.println("NetWorkThread --->" + Thread.currentThread().getName());            //模拟访问网络 所以当线程启动时 休眠两秒钟            try {                Thread.sleep(2*1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            //变量s的值 模拟从网络当中获取的数据            String s = "从网络当中获取的数据";            // text.setText(String s)这种做法是错误的 因为在Worker Thread不能操作ui            Message msg = netWorkHandler.obtainMessage();            //将获得的信息赋值给msg的属性 通过在Main Thread中获得msg 从而获得需要的信息            msg.obj = s;            netWorkHandler.sendMessage(msg);        }    }    class NetWorkHandler extends Handler{        @Override        public void handleMessage(Message msg) {            //输出语句 用来证明当前执行线程为Main Thread            System.out.println("NetWorkHandler --->" + Thread.currentThread().getName());            //得到从Worker Thread中传出的Message msg对象            //同时通过调用msg的属性 来获得需要的信息            String s = (String)msg.obj;            textView.setText(s);        }    }
0 0