android 安卓子线程和主线程交互

0基础安卓,为了记录。


1.安卓为什么要执行子线程,什么情况下用子线程?

答:将消耗时间的任务放到子线程中执行,保证主线程UI的流畅性。

2.具体实现

当需要请求网络数据的时候,会把请求过程放在子线程里,主线程调用的时候直接是checkBag(参数)。

比如我需要类似于web的ajax验证

public void checkBag(final String bagCode){
        //取出后端的数据
        Thread thread = new Thread("Thread1") {
            HttpURLConnection connection = null;
            BufferedReader reader = null;
            public void run() {
                String url = Tools.getPropertiesURL(CaptureActivity.this,"url.prop","urlCheck");
                //show(url);
                try {
                    String responseSend = HttpCheck.checkBag(bagCode,url);
                    //消息机制
                    Bundle bundle = new Bundle();
                    bundle.putString("result",responseSend);
                    bundle.putString("bagCode",bagCode);
                    Message msg = new Message();
                    msg.setData(bundle);
                    myhandler.sendMessage(msg);
                    msg.what = 0;
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            };
        };
        thread.start();
    }

用message或者buddle进行和主线程通信,

主线程有一个handler,handler包含线程队列和消息队列,实现异步消息处理机制。

主要作用有:1.运行在某个线程上,共享线程的消息队列。2.接收消息、调度消息、派发消息和处理消息。3.实现消息的异步处理。

简单理解为:一个连接主线程和子线程的工具。

上面的代码中有

myhandler.sendMessage(msg);
msg.what = 0;

这是讲请求返回的数据发送到主线程,并添加一个标识 what,这个what很重要,用来区分哪个线程发送的数据。子线程发送数据后需要主线程来接受,在哪接受呢?就是handler,hander的代码:

private static class MyHandler extends Handler {
    private final WeakReference<CaptureActivity> mActivity;

    public MyHandler(CaptureActivity activity) {
        mActivity = new WeakReference<CaptureActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        Bundle bundle = new Bundle();
        bundle = msg.getData();
        if (mActivity.get() == null) {
            return;
        }
        mActivity.get().updateUIThread(msg);
    }
}
updateUIThread(msg);

handler是一个中转的过程,需要将msg传到更新主线程的方法中,上面updateUIThread(msg)就是起这么个作用。

updateUIThread代码是:

private void updateUIThread(Message msg){
        switch (msg.what){
            case 0:
                //what标识为0的线程执行操作,填充数据,跳转等
                break;
            case 1:
                //what标识为1的线程执行操作
                break;
            default:
                //默认的情况
                break;
        }
    }

所以就实现了线程和主线程直接的通信

猜你喜欢

转载自blog.csdn.net/qqnbsp/article/details/80020010
今日推荐