android UI线程与AsyncTask的问题

haiwanghappy 2011-08-13 02:37:20
需求是这样的:一个费用模块显示一些数据,上面还一个隐藏的bar控件来显示更新。首先他会显示数据库中的数据,过5秒后会更新数据,bar出现-->显示:正在更新,还有一个progressbar在动;更新是从网络中提取数据,保存到数据库中后,再从数据库更新视图的数据,设置过2秒更新完成,bar的文本改成:更新完成 ;再过2秒bar消失。
请问能够使用一个AsyncTask的一个子类来管理这些步骤的全部流程么?
我自己试了试,在task中不可创建新的线程来使用UI,
而使用Task本身使用Thread.sleep()则使得效果很不对,

本人第一次发表问题,csdn的流程还不清楚,请各位海涵,有时间会仔细熟悉一下csdn。
还请各位对AsyncTask有什么特别的认识能说明一下,网上的对AsyncTask我已经都看过了,这个task大概是对UI的一小模块任务进行管理吧,有多个步骤好像就不大好用了。

或者使用task不能管理所有步骤,或是大家有什么其他思路,简要说一下吧,最后再次谢谢大家了,我菜鸟一个,或许连菜鸟都说不上,分数我也不清楚。抱歉了。
...全文
318 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
完美灬缺陷 2011-09-06
  • 打赏
  • 举报
回复
ASyncTask异步处理、正好学习下。
haiwanghappy 2011-09-06
  • 打赏
  • 举报
回复
/**
* 首先执行--更新进度条显示,费用数据先从数据库中取得并显示
*/
@Override
protected void onPreExecute() {
//显示进度条
barManager.setProgressViewVisiable(true);
barManager.setTitle(this.activity.getString(R.string.update_bar_title_updating));
super.onPreExecute();
}
/**
* 后台进行费时的更新数据操作--从网络上读取最新数据--不可操作UI线程的UI控件,转到更新进度方法执行
*/
@Override
protected Void doInBackground(Void... params) {
long version = fee==null?0L:fee.getTime();
JSONObject jo = NetService.getIndexFee(Information.PHONE_NUMBER,version);
if(JsonUtils.isLastestData(jo)){
//已是最新数据
}else{
if(JsonUtils.isSuccess(jo)){
//更新成功,刷新页面费用信息,并保存至数据库
if(fee==null){
fee = new Fee();
fee.setId(JsonUtils.getTime(jo));
fee.setPhone_num(Information.PHONE_NUMBER);
fee.setPosition(Fee.POSITION_INDEX);
}
fee.setTime(JsonUtils.getTime(jo));
fee.setData(JsonUtils.getDataArr(jo).toString());
DBService.updateFee(fee);
publishProgress(1);
}else{//更新失败
publishProgress(0);
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
/**
* 更新进度条--转换title文本
*/
@Override
protected void onProgressUpdate(Integer... values) {
barManager.setProgressBarVisiable(false);
switch (values[0]) {
case 0://更新失败
barManager.setTitle(IndexUpdateFeeTask.this.activity.getString(R.string.update_bar_title_failed));
break;
case 1://更新成功
barManager.setTitle(IndexUpdateFeeTask.this.activity.getString(R.string.update_bar_title_succeed));
updateFeeFromDB();
break;
default:
break;
}
super.onProgressUpdate(values);
}
/**
* 最后返回
*/
@Override
protected void onPostExecute(Void result) {
barManager.setProgressViewVisiable(false);
super.onPostExecute(result);
}
当时的代码,主要意思是:dobackground执行费时的后台任务,这个函数是和UI线程不同步的(onProgressUpdate和onPostExecute都是和UI线程同步的),如果想更新UI就要调用publishProgress方法来给onProgressUpdate函数执行的机会,dobackground函数是单独一个线程可以自己沉睡而不影响UI线程,其实知道这三个函数与UI线程的同步关系就知道自己设计的东西该怎么做了。
傲慢的上校 2011-08-26
  • 打赏
  • 举报
回复
学习下。。。
softroad 2011-08-17
  • 打赏
  • 举报
回复
学习了。
haiwanghappy 2011-08-17
  • 打赏
  • 举报
回复
已经做完了,
1.onpreExcute()初始化进度条
2.doinbackground()进行后台费时操作,操作完根据状态更新UI,使用publishProgress()方法调用onProgressUpdate()执行,并且在此线程睡眠一段时间
3.最后onPostExecute()执行进度条消失。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧