美文网首页UIT
Handler-线程间消息传递 (二)

Handler-线程间消息传递 (二)

作者: siyanGo | 来源:发表于2017-02-06 14:58 被阅读24次

Handler 在子线程工作

public class MainActivity extends AppCompatActivity {

    private Button mButton;

    private TextView textView;

    DownLoad mLoad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initview();

        initDownLoad();


    }

    private void initview() {
        mButton = (Button) findViewById(R.id.test_btn);
        textView = (TextView) findViewById(R.id.textview);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Message message = new Message();
                message.obj = "sql work";
                mLoad.mHandler.sendMessage(message);
            }
        });

    }

    private void initDownLoad() {

        mLoad = new DownLoad();
        new Thread(mLoad).start();
    }


    class DownLoad implements Runnable {

        private Handler mHandler;

        @Override
        public void run() {



            Log.d("123", Thread.currentThread().getName());

            try {
                Thread.sleep(5000);

                mHandler = new Handler() {

                    @Override
                    public void handleMessage(Message msg) {

                        Log.d("123", msg.obj.toString());
                        
                        //获得主线程发来的消息,进行耗时处理,比如sql操作
                    }
                };
            } catch (InterruptedException e) {
                e.printStackTrace();
            }


        }
    }


}

在这里又报错了:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

无法在未调用Looper.prepare()的线程中创建handler.

通过看源码例子 实现以下代码

  public void run() {

            Looper.prepare();

            Log.d("123", Thread.currentThread().getName());

            try {
                Thread.sleep(5000);

                mHandler = new Handler() {

                    @Override
                    public void handleMessage(Message msg) {

                        Log.d("123", msg.obj.toString());
                    }
                };
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Looper.loop();
        }
    }

这样就能正常使用了,到这里基础的用法就已经理解了,想要理解Handler还是需要看源码的,下篇再让我们从源码分析下Handler的使用

Handler源码浅析(一)
Handler总结

相关文章

  • Handler-线程间消息传递 (二)

    Handler 在子线程工作 在这里又报错了:java.lang.RuntimeException: Can't ...

  • Handler-线程间消息传递 (一)

    初识Handler 一.什么是线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程...

  • Handler消息机制浅谈

    # Handler- Handler在多线程间进行消息通信,维持handler机制的主要控件:Handler+Me...

  • Handler详解

    Handler详解 举例 线程间传递数据(主线程跟子线程、两个子线程) 简介 一套android消息传递机制。在多...

  • Handler

    Handler是什么? handler是线程间消息传递的桥梁,主要用来发送消息和处理消息。 为什么需要做线程间的通...

  • 2.Java内存模型

    1.java并发编程的线程间通信及线程间如何同步线程间通信分为:共享内存,消息传递。线程间同步:共享内存是代码指定...

  • android线程间消息传递机制

  • Android Handler消息机制底层实现

    Handler与Looper、MessageQueue共同实现了线程间消息传递。MessageQueue的底层实现...

  • 跨线程消息传递(Handler机制)

    Handler 机制 实现了跨线程间消息传递 耗时操作在新建线程中进行,结果返回到主线程(UI线程) **更新 U...

  • Android消息机制

    Handler,Looper机制是android中的消息系统,两个线程间传递消息,(进程间也可以使用Messeng...

网友评论

    本文标题:Handler-线程间消息传递 (二)

    本文链接:https://www.haomeiwen.com/subject/jlwyittx.html