gpt4 book ai didi

Handler与Android多线程详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Handler与Android多线程详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

下面是一段大家都比较熟悉的代码:

复制代码 代码如下:

Handler handler = new Handler(); handler.post(myThread),

  。

//使用匿名内部类创建一个线程myThread Runnable mythread = new Runnable() { public void run() { } },

一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此.

  。

上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已.

这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态.

那么应该如何去实现真正的多线程呢?

一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法.

还有另外一种方法,代码如下:

复制代码 代码如下:

//HandlerThread建立了一个新线程,它包含一个Looper HandlerThread handlerThread = new HandlerThread("handler_Thread"); handlerThread.start();//启动一个线程 MyHandler myHandler = new MyHandler(handlerThread.getLooper());//使用新线程的Looper建立一个Handler //此时MyHandler便与一个新线程绑定到一起了 。

  。

Message msg = myHandler.obtainMessage(); msg.sendToTarget();//将message压入提供message的Handler的消息队列中 。

//建立一个Handler的子类 class MyHandler extends Handler { MyHandler(Looper looper) { super(looper); } public void handleMessaage(Message msg) { //处理消息的代码 } } 。

今天我又仔细的看了一下Android文档,发现android虽然支持上两种建立线程的方法,但是它有一个规则:

  。

原文是:it violates the second rule of the single-threaded model: do not access the Android UI toolKit from outside the UI thread. 。

大概意思就是:Android不支持在UI线程以外的线程中修改UI控件。比如给一个Textview设置文字,这样的操作便不能放在UI线程以外的线程内执行,否则便会出现异常.

最后此篇关于Handler与Android多线程详解的文章就讲到这里了,如果你想了解更多关于Handler与Android多线程详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com