TabActivity下在AsyncTask中使用ProgressDialog存在问题的解决方法
2011-03-29 09:07
357 查看
Android提供了两种主要的异步操作方法:
第一种就是采用Thread执行内容,然后通过handler来获知线程结果以更新UI,但是这种方式对线程的安全性需要程序员来进行控制;
第二种是采用AsyncTask,这种方式是线程安全的,当然也意味着效率会比第一种稍低,不过还是可以接受的。
但是在TabActivity中用AsyncTask方法进行异步操作的时候,如果在超过两层的activity中使用了ProgressDialog,就会存在问题。这个大概是Android本身的bug,或者不叫bug,而是一种限制。对于这种情况,目前没有什么很好的正规解决方案,不过在大部分情况下可以采用如下workaround来解决。
view sourceprint?
主要思路很简单,就是由于是超过两层的Activity中会出问题,所以就使用父级的Context,这样就能workaround了。
第一种就是采用Thread执行内容,然后通过handler来获知线程结果以更新UI,但是这种方式对线程的安全性需要程序员来进行控制;
第二种是采用AsyncTask,这种方式是线程安全的,当然也意味着效率会比第一种稍低,不过还是可以接受的。
但是在TabActivity中用AsyncTask方法进行异步操作的时候,如果在超过两层的activity中使用了ProgressDialog,就会存在问题。这个大概是Android本身的bug,或者不叫bug,而是一种限制。对于这种情况,目前没有什么很好的正规解决方案,不过在大部分情况下可以采用如下workaround来解决。
view sourceprint?
01.
public
class
MyActivity
extends
Activity {
02.
03.
protected
void
onCreate(Bundle savedInstanceState) {
04.
// TODO Auto-generated method stub
05.
super
.onCreate(savedInstanceState);
06.
07.
//判断是否存在父Activity
08.
Context c;
09.
if
(getParent() !=
null
) c =getParent();
10.
else
c =
this
;
11.
AsyncClassasync =
new
AsyncClass(c);
12.
async.execute();
13.
}
14.
15.
@Override
16.
protected
void
onResume() {
17.
// TODO Auto-generated method stub
18.
super
.onResume();
19.
}
20.
21.
class
AsyncClass
extends
AsyncTask {
22.
private
Context context;
23.
private
ProgressDialog progressDlg;
24.
25.
public
AsyncLoadData(Context c) {
26.
this
.context = c;
27.
}
28.
29.
@Override
30.
protected
String doInBackground(Void... params) {
31.
// TODO Auto-generated method stub
32.
fillData();
33.
return
null
;
34.
}
35.
36.
protected
void
onPostExecute(String result) {
37.
//Do some work
38.
progressDlg.cancel();
39.
}
40.
41.
protected
void
onPreExecute() {
42.
progressDlg =
new
ProgressDialog(context);
43.
progressDlg.setMessage(
"ing..."
);
44.
progressDlg.setCancelable(
false
);
45.
progressDlg.show();
46.
}
47.
}
48.
49.
}
主要思路很简单,就是由于是超过两层的Activity中会出问题,所以就使用父级的Context,这样就能workaround了。
相关文章推荐
- TabActivity下在AsyncTask中使用ProgressDialog存在问题的解决方法
- 仿APiDemo使用ProgressDialog 并解决调用dismiss方法后没有对话框不消失的问题
- 前端使用Jquery的getJSON方法,后台使用PHP,解决IE和火狐Firefox中存在的跨域ajax请求问题。
- VS2010使用C++/CLI编程窗口无法显示问题解决方法
- Linux使用过程中常见问题及其解决方法
- 应用程序无法正常启动0xc0000142) 关于win10周年版更新后无法正常使用vc6.0问题的解决方法
- 解决使用base64解码太慢的问题,原因是根本就不应该使用此方法解决。
- 使用Sublime Text时unable read project问题的解决方法
- Spring 使用注解注入,调用类实例出现 java.lang.NullPointException 问题的解决方法
- 使用lifecycle时,1.0.0和1.0.3问题解决方法
- Ubuntu上使用Codeblocks遇到的一些问题及解决方法
- 关于tensorboard的使用不显示的问题解决方法
- IntelliJ 使用的一些问题和解决方法
- 使用V7包的一些问题解决方法
- 在TabActivity中无法使用bindService的解决方法
- android studio使用模拟器上时出现中文乱码问题解决方法
- scanf使用常见问题及解决方法
- 初次使用bantu16.04LTS时几个小问题的解决方法记录
- 使用SourceSafe管理软件开发可能遇到的问题及解决方法
- OSWatcher使用过程中小问题解决方法