安卓多线程处理机制怎样把主线程中访问网络的部分放在子线程中,代码如下

| 漏洞检测 |
| 隐藏捆绑 |
Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
关键字:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况。本文主要研究Handler的消息发送。包括主线程往子线程发送消息,子线程之间互相发送
关键字: 间 (主 与 子线程之间)、(子线程 与 子线程之间)
相信大家平时都有到异步线程往主线程(UI线程)的情况。本文主要研究Handler的消息发送。包括主线程往子线程发送消息,子线程之间互相发送消息。
一、主线程向子线程发送消息。
过程比较简单:
主线程发送消息到异步线程,异步线程接收到消息后在再发送一条消息给主线程。
1. 初始化主线程的Handler,用来接收子线程的消息。
2. 启动异步线程,在异步线程中创建Looper,并初始化一个异步线程的Handler。
3. 主线程获取异步线程的Handler(这里涉及到线程间同步的知识),并向异步线程发送消息。
4. 异步线程Handler接收到消息以后,获取主线程的Handler,并向主线程发送消息。
5. 主线程收到异步线程发来的消息。
1. 这里说的主线程Handler或者异步线程Handler,指的是绑定在对应线程消息队列上的一个Handler对象而已,在Handler的构造函数中传入对应线程的Looper对象即可。
2. 为什么要使用线程锁来处理,是因为异步线程启动不是实时的,主线程获取异步线程的Handler时有可能为空,如果为空,需要等待异步线程先初始化Handler。
package com.example.chen.
import android.app.A
import android.os.B
import android.os.H
import android.os.L
import android.os.M
import android.util.L
* 用Handler测试主线程往子线程发送消息
* @author chen
public class HandlerSimpleActivity extends Activity {
private Handler mainH
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 启动异步线程
final AsyncThread asyncThread = new AsyncThread();
asyncThread.start();
// 初始化主线程的Handler
mainHandler = new Handler(Looper.myLooper(), new Handler.Callback() {
public boolean handleMessage(Message msg) {
// 主线程收到消息
Log.e(HandlerSimpleActivity.class.getSimpleName(),
MainHandler Receiver Message curThread =
+ Thread.currentThread().getName());
// 获取异步线程的Handler
= asyncThread.getHandler();
if (handler != null) {
Log.e(HandlerSimpleActivity.class.getSimpleName(),
MainThread Send Message curThread =
+ Thread.currentThread().getName());
// 向异步线程发送消息
handler.sendEmptyMessage(0);
* 异步线程
private class AsyncThread extends Thread {
public void run() {
super.run();
Log.e(HandlerSimpleActivity.class.getSimpleName(),
AsyncThread Start curThread =
+ Thread.currentThread().getName());
Looper.prepare();
// 初始化异步线程的消息循环队列
if (handler == null) {
synchronized (AsyncThread.class) { // 线程间安全
// 为异步线程的消息循环队列新增一个Handler
handler = new Handler(Looper.myLooper(), new Handler.Callback() {
public boolean handleMessage(Message msg) {
// 异步线程收到消息
Log.e(HandlerSimpleActivity.class.getSimpleName(),
AsyncHandler Receiver Message curThread =
+ Thread.currentThread().getName());
// 异步线程发送消息到主线程
Log.e(HandlerSimpleActivity.class.getSimpleName(),
AsyncThread Send Message curThread =
+ Thread.currentThread().getName());
mainHandler.sendEmptyMessage(0);
// 异步线程Handler初始化完毕
Log.e(HandlerSimpleActivity.class.getSimpleName(),
AsyncHandler Inited curThread =
+ Thread.currentThread().getName());
AsyncThread.class.notifyAll();
Looper.loop();
* 获取异步线程的Handler
public Handler getHandler() {
if (handler == null) {
synchronized (AsyncThread.class) {
// 线程间安全
if (handler == null) {
// 获取异步线程的handler为空,释放锁,等待异步线程初始化完毕。
Log.e(HandlerSimpleActivity.class.getSimpleName(),
getHandler wait curThread =
+ Thread.currentThread().getName());
AsyncThread.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
// 异步线程Handler初始化完毕,主线程继续
Log.e(HandlerSimpleActivity.class.getSimpleName(),
getHandler notified curThread =
+ Thread.currentThread().getName());
上结果截图:
二、子线程间使用Handler互相发送消息:
日19:47:31 等待下次更新(*^__^*) 嘻嘻&&
(责任编辑:幽灵学院)
------分隔线----------------------------
这篇文章将给大家介绍android图片处理的高效做法,大家有需求的时候可以参考一下。 首...
引言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用。Service服...
上拉刷新,即当ListView滚动到底部的时候,再继续拉取的时候,将出现一个提示告诉你正...
根据打开文件的类型不同启动不同的activity 1、假如我们要关联所有的文件 则需要在And...
这个问题相信很多人从网上已经搜到不少的解决方案, android 无法生成R文件 是件痛苦...
返回键两次退出 private long exitTime = 0;@Overridepublic boolean onKeyDown(int k...
admin@1744.cc
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院
广告服务:QQ:android里如何在子线程中如何更新主线程的控件 - 下载频道 - CSDN.NET
&&&&android里如何在子线程中如何更新主线程的控件
&android里如何在子线程中如何更新主线程的控件
本文档详细讲解了android里如何在子线程中如何更新主线程的控件
若举报审核通过,可奖励20下载分
被举报人:
javaniceyou
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
评价资源返积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
移动开发下载排行
积分不够下载该资源
如何快速获得积分?
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
android里如何在子线程中如何更新主线程的控件
所需积分:1
剩余积分:
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
VIP服务公告:android中怎样让main线程和子线程同步一个变量啊?
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
synchronized(this){ Method}&&然后子线程也一样.
这是在Activity里写吗?
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
在Activity里面写个synchronized修饰的方法,里面去对hashmap操作,这样就行了
不行,最终要打包成控件,跟activity分开的越明显越好,最好就像Button那样,在哪个工程里都可以导进来后直接通过方法使用。
那就写在控件里面&
该用户从未签到主题帖子e币
不行,最终要打包成控件,跟activity分开的越明显越好,最好就像Button那样,在哪个工程里都可以导进来后 ...
那就写在控件里面
你说的太模糊了,还是不懂&
该用户从未签到主题帖子e币
看你贴出来的log,貌似是因为数据更新和& &notifyDataSetChanged()节奏不一样(其实就是数据不一致)。。
试试& & 把 遍历、排序hashmap的方法抽出来,放到getView()外面,假设为& &
boolean&&listHashMap();
要更新数据源之前调用排序。
if(cusadapter. listHashMap()){
handle.sendMessage( );
大概的思路就是cusadapter.notifyDataSetChanged();之前保证就算refresh更新的数据暂时不会变化& &
或者你也可以用临时变量试试& &&&refresh之后的数据放到临时变量中,在cusadapter.notifyDataSetChanged();之前 把临时变量的数据提出来,然后清空临时变量。
只是思路。。具体的你自己试试吧
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
那就写在控件里面
你说的太模糊了,还是不懂
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
你看可不可以这样:1子线程接受信息,并保存处理获得的信息;2通知主线程,有新消息添加,在主线程的handle ...
按你说的的确解决了这个问题,可是又出现了新问题,由于在主线程,也就是UI线程里需要做的事太多,又出现了程序反应不及时甚至最后弹出一个窗口问,是继续等待还是强制关闭程序。
更新的ui多了?一般ui卡都是数据处理问题吧,是动画效果什么的需要不断更新ui可以试试异步处理&
1map加个变量,排个序,应该很快吧。
2建议你如果消息很频繁,你可以先用个临时hasmap缓冲下,如果临时hasmap大小超过一定数目的时候,再通知handle处理,清空临时hasmap,你先试试&
该用户从未签到主题帖子e币
pubic void refresh ( )
接收新信号,存进hashmap
handle.sendMessage( )……通知adapter更新
pubic void refresh ( )
handle.sendMessage( )……存进hashmap+通知adapter更新
如果adapter的数据是hashmap 那就要保证hashmap在ui线程有更改后adapter及时调用notifidatasetchanged()
这个方法我试过了,还是不行,会引起主线程反应迟钝,最终因为响应不及时而强行关闭&
该用户从未签到主题帖子e币
把这变量声明为 volatilei即可
签到天数: 13 天连续签到: 2 天[LV.3]偶尔看看II主题帖子e币
按你说的的确解决了这个问题,可是又出现了新问题,由于在主线程,也就是UI线程里需要做的事太多,又出现 ...
1map加个变量,排个序,应该很快吧。
2建议你如果消息很频繁,你可以先用个临时hasmap缓冲下,如果临时hasmap大小超过一定数目的时候,再通知handle处理,清空临时hasmap,你先试试
该用户从未签到主题帖子e币
有一种ConcurrentHashMap 封装了同步机制 可以试试
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
pubic void refresh ( )
这个方法我试过了,还是不行,会引起主线程反应迟钝,最终因为响应不及时而强行关闭
读取数据的耗时操作放在子线程中,读取完毕后把数据放在Message.obj中传到主线程&
该用户从未签到主题帖子e币
这个方法我试过了,还是不行,会引起主线程反应迟钝,最终因为响应不及时而强行关闭 ...
读取数据的耗时操作放在子线程中,读取完毕后把数据放在Message.obj中传到主线程
简单点说,现在的情况是,启动了一条子线程用来接收数据,存进hashmap,并对里面的数据排序,排完后发送message,通知主线程,adapter有变化了,然后主线程就得开始更新adapter吧,但是更新时还是要遍历hashmap的呀&
也不行的吧,关键是Adapter的更新是在主线程里(我不知道能不能想办法弄到一个子线程里,反正现在还不会弄),而getview( )执行时就是要遍历hashmap里的数据,如果还没遍历完,又轮到了refresh( )执行的话,那就&
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
读取数据的耗时操作放在子线程中,读取完毕后把数据放在Message.obj中传到主线程 ...
也不行的吧,关键是Adapter的更新是在主线程里(我不知道能不能想办法弄到一个子线程里,反正现在还不会弄),而getview( )执行时就是要遍历hashmap里的数据,如果还没遍历完,又轮到了refresh( )执行的话,那就还是出错啊!我始终想不出能有什么同步的办法!!!!
签到天数: 145 天连续签到: 1 天[LV.7]常住居民III主题帖子e币
读取数据的耗时操作放在子线程中,读取完毕后把数据放在Message.obj中传到主线程 ...
简单点说,现在的情况是,启动了一条子线程用来接收数据,存进hashmap,并对里面的数据排序,排完后发送message,通知主线程,adapter有变化了,然后主线程就得开始更新adapter吧,但是更新时还是要遍历hashmap的呀!如果正在遍历,半途中CPU该轮到refresh( )执行了,那就又要不同步而出错了
这个问题主要是因为Adapter的数据改变(hashmap)和更新不同步造成的,所以只允许在ui线程中改变hashmap 并且在改变后立即调用adapter.notifydatasetchanged()
不要在子线程中修改adapter的数据(hashmap)
可以在子线&
该用户从未签到主题帖子e币
在refresh中将数据处理后保存到一个临时的hashmap,然后用handler发消息给UI线程,UI线程将临时hashmap中的数据添加到listview绑定的hashmap中,然后adapter.notifydatasetchanged()
QQ已认证,此人靠谱
推荐阅读热门话题
6181113761150619563536508481455386286246246232715
13&分钟前14&分钟前15&分钟前15&分钟前16&分钟前17&分钟前21&分钟前半小时前半小时前半小时前半小时前半小时前半小时前页面导航:
→ 正文内容 android子线程更新界面
android开发教程之子线程中更新界面
本文主要介绍Android的Handler的使用方法。Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列
每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器。2)线程间通信。在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。
通过Runnable在子线程中更新界面的例子
在onCreate中创建Handler 代码如下:public class HandlerTestApp extends Activity { Handler mH TextView mT /** Called when the activity is first created. */ && @Override && public void onCreate(Bundle savedInstanceState) { && super.onCreate(savedInstanceState); && setContentView(R.layout.main); && mHandler = new Handler();//创建Handler && mText = (TextView) findViewById(R.id.text0);//一个TextView && }构建Runnable对象,在runnable中更新界面,此处,我们修改了TextView的文字.此处需要说明的是,Runnable对象可以再主线程中创建,也可以再子线程中创建。我们此处是在子线程中创建的。 代码如下:RunnablemRunnable0=newRunnable(){@Overridepublicvoidrun(){//TODOAuto-generatedmethodstubmText.setText("ThisisUpdatefromohterthread,MouseDOWN");}};
创建子线程,在线程的run函数中,我们向主线程的消息队列发送了一个runnable来更新界面。 代码如下:privatevoidupdateUIByRunnable(){newThread(){//Messagemsg=mHandler.obtainMessage();publicvoidrun(){//mText.setText("ThisisUpdatefromohterthread,MouseDOWN");//这句将抛出异常mHandler.post(mRunnable0);}}.start();}
用Message在子线程中来更新界面用Message更新界面与Runnable更新界面类似,只是需要修改几个地方。实现自己的Handler,对消息进行处理 代码如下:privateclassMyHandlerextendsHandler{@OverridepublicvoidhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubsuper.handleMessage(msg);switch(msg.what){caseUPDATE://在收到消息时,对界面进行更新mText.setText("Thisupdatebymessage");}}}
在新的线程中发送消息 代码如下:privatevoidupdateByMessage(){//匿名对象newThread(){publicvoidrun(){//mText.setText("ThisisUpdatefromohterthread,MouseDOWN");//UPDATE是一个自己定义的整数,代表了消息IDMessagemsg=mHandler.obtainMessage(UPDATE);mHandler.sendMessage(msg);}}.start();}
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910主题 : 如何在子线程中刷新主线程中所有需要设置背景的对象
级别: 侠客
可可豆: 447 CB
威望: 417 点
在线时间: 68(时)
发自: Web Page
来源于&&分类
如何在子线程中刷新主线程中所有需要设置背景的对象&&&
网络客户端,底层时http,中间时逻辑层,中间层如何刷新主视图(多个视图)需要刷新图片的对象背景,不同对象设置图片方法不一样,如何实现 一个通用刷新图片的方法!
级别: 论坛版主
UID: 35043
发帖: 1566
可可豆: 10290 CB
威望: 10290 点
在线时间: 3519(时)
发自: Web Page
[self performSelectorOnMainThread:&#(SEL)#& withObject:&#(id)#& waitUntilDone:&#(BOOL)#&];
级别: 侠客
可可豆: 447 CB
威望: 417 点
在线时间: 68(时)
发自: Web Page
回 1楼(rainbird) 的帖子
这是到主线程执行相应方法, 但我在底层 http收发 和 主界面中 还有个 中间层, 要刷新 主界面多个 控件的背景图。
级别: 侠客
可可豆: 661 CB
威望: 611 点
在线时间: 369(时)
发自: Web Page
在主线程postNotification, 把需要刷新的信息放到notification里面。
级别: 侠客
可可豆: 447 CB
威望: 417 点
在线时间: 68(时)
发自: Web Page
回 3楼(shichangone) 的帖子
恩 已经解决了 用通知和 委托都行的
级别: 新手上路
可可豆: 136 CB
威望: 136 点
在线时间: 253(时)
发自: Web Page
回 4楼(chenakja) 的帖子
哥们能把代码贴出来吗?
级别: 侠客
可可豆: 447 CB
威望: 417 点
在线时间: 68(时)
发自: Web Page
回 5楼(gxzlolo) 的帖子
用的是通知 如下:在 收完数据后 调用 [ self setValue:[NSNumber numberWithBool:YES] forKey:@&isFinish&];调用通知 然后上层进行相应方法。 不知道为什么 虚拟机里 不能直接复制黏贴。。只能打这里了 后面我再上传
关注本帖(如果有新回复会站内信通知您)
9*6-8 正确答案:46
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 按键精灵安卓版多线程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信