ui主线程控件的更新就让这个activity的异步任务做完整

项目中使用的SingleMessageView,控件实例化后,点击用户头像,此时跳转到UserInfo里查看这个用户的头像、用户名、签名、标签。

之前,师兄在SingleMessage里写了个头像的点击响应,点击用户头像,把用户的用户名通过intent传给UserInfo,同时执行想服务器获取这个用户的签名和标签的异步任务,把这两个值也通过同一个intent传递过去,然后UserInfo的onResume()函数接收intent,进行主线程ui布局的更新,源代码如下:


//other用户头像响应
private ImageView.OnClickListener userHeadImgViewListener=new ImageView.OnClickListener() {

@Override
public void onClick(View v) {

String userNameTemp =users_name;
String otheruserData[] = { "" };
otheruserData[0] = userNameTemp;//获取用户名

//建立网络链接,执行请求签名和标签的异步任务
ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isConnected()){

asyncWebkForOtherinfo = new webTaskForOtherinfo();

if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
asyncWebkForOtherinfo.executeOnExecutor(
webTaskForOtherinfo.THREAD_POOL_EXECUTOR, otheruserData);

} else {
asyncWebkForOtherinfo.execute(otheruserData);
}
Log.e("otherinfodown","有网!");
}else {
Log.e("otherinfodown","没有网络连接,请联网后重试...");
}

// TODO Auto-generated method stub
ARUtils.own_information=false;
Intent intent= new Intent(SingleMessageView.this.getContext(),UserInfoActivity.class);

intent.putExtra("name", users_name);
intent.putExtra("label",othersignature);//获取异步任务返回的标签和签名
intent.putExtra("sign",otherlabel);
String head_img_url= getAppPath() +"/user_portrait/"+users_name+".jpg";
intent.putExtra("head_img_url", head_img_url);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//标志位用来区分是哪个activity传过来的intent
SingleMessageView.this.getContext().startActivity(intent);
Log.v("head_img_click","success");

}

} ;

在userInfo的onResume()中:


//在onResume中获取intent的用户名、头像路径、标签、签名

Intent intent = getIntent();
String other_head_img_url=intent.getStringExtra("head_img_url");
String name=intent.getStringExtra("name");
String label=intent.getStringExtra("label");
String sign=intent.getStringExtra("sign");
userNameText.setText(name);
signatureConent.setText(label);
myTab.setText(sign);
Bitmap smallBitmap=ARUtils.loadBitmapFile(other_head_img_url,48, 48);
userImgButton.setImageBitmap(smallBitmap);

调试结果就是:在singleMessage里获取到的签名和标签,intent怎么都获取不到。。。按照正常的逻辑,以为执行异步任务,把值都赋值给全局变量sign、label,然后会返回到用户头像响应的方法里面,接着执行intent的传值操作,逻辑没有正常运行的原因就是异步任务是个很自由的类,你限制人家自由太多了。。。

异步任务的执行时间和返回,不受ui主线程的控制,主线程不会乖乖的等异步任务执行完,在去接着执行异步任务下面的语句,这样异步任务的意义也就没有木有了。。

所以,更新ui主线程的操作一定要放在异步任务的post方法里面,主线程该干嘛干嘛,既然你用到了异步任务,就让异步任务把该做完的做完,并且,这个异步任务的位置一定要放在与ui主线程同一个activity里面!

所以,最后,我们的解决方法就是在singleMessage里,点击用户头像,把用户名通过intent传过去,同时跳转到userInfo,在userInfo的onResume()里,接收intent后,执行自定义的otherInfo(othername)方法,otherInfo(String
othername)这个方法里,执行异步任务webTaskForOtherINfo();把用户名传给异步任务,然后在UserInfo里定义webTaskForOtherINfo()这个类,执行向服务器请求标签、签名任务,在post函数里执行更新UI控件的更新,就ok啦。。。。。。

ui主线程控件的更新就让这个activity的异步任务做完整

时间: 2024-10-10 16:18:12

ui主线程控件的更新就让这个activity的异步任务做完整的相关文章

C#子线程调用主线程控件

代码如下: private void ShowMsg(string msg) { if (this.InvokeRequired) { this.Invoke(new Action<string>(ShowMsg), msg); } else { this.txbLog.AppendText(msg); } } private void btnLive_Click(object sender, EventArgs e) { if (this.btnLive.Text == "Live

【Android开发经验】来来来,同学,咱们讨论一下“只能在UI主线程更新View”这件小事

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 "只能在UI主线程中更新View". 这句话很熟悉吧? 来来,哥们,看一下下面的例子 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) f

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

Android,UI主线程与子线程

在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个Process. 一个Android 程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread.          在这么多Thread当中,有一

在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍. 在

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

解决iOS程序UI主线程和定时器相互阻塞的问题

我的问题是这样,我的页面上有一个UIScrollView和一个定时器用来记录当前考试模式下的剩余时间,问题出现了:当我滑动滚动试图时,定时器的方法便不在运行(即被UI主线程阻塞).google一下找到了解决办法:将定时器放在非主线程中执行将更新UI的操作放到主线程,这样UI主线程和定时器就能互不干扰的相互工作了. 在另一个项目中,还解决了一个问题:手机验证码,获取按钮,点击获取后,会开始倒计时一段时间,按钮不可点,按钮上的文字不断变化. 获取验证码 120秒后重新获取 119秒后重新获取 以下是

Essential ASP.NET MVC日历排程控件Essential Schedule for ASP.NET MVC 控件介绍及下载

Essential Schedule for ASP.NET MVC是一款界面控件,让开发人员添加OutLook外观的日历日程控件到你应用程序中,支持AJAX,内嵌多种皮肤,支持多种时间视图,支持打印等. 具体功能: 支持日程水平或垂直显示. 支持在运行时创建.读取.更新和删除任务活动 支持拖拉任务活动 支持设置任务活动的优先级 支持设置循环任务活动 支持为任务活动设置提示信息 控件为任务活动提供了右键菜单,以便客户更方便操作 支持Day View.Week View.Workweek View

推荐几款基于HTML5的优秀UI开发控件

UI开发控件很多,当需要满足跨平台的需求时,目前比较火爆的是HTML5技术,小编在这里给工程师们推荐几款评价较好的几款控件,希望能够帮助到大家.      控件一:Essential Studio for JavaScript 概述:essential studio是首款专门用于LOB应用开发的JavaScript框架.包含40多种独特的.全新设计的控件,包括网格.图表.计量器.编辑器.树形视图.菜单.OLAP网格等等. 特点: 1.基于最新的HTML5技术的UI开发控件: 2.包括多种类型的子