我在后台线程(我使用AsyncTask)下载了一些来自互联网的数据,并在下载时显示进度对话框.方向更改,Activity重新启动,然后我的AsyncTask完成 - 我想关闭progess对话框并启动一个新的Activity.但是调用dismissDialog有时会抛出一个异常(可能是因为Activity被销毁而且还没有启动新的Activity).
处理此类问题的最佳方法是什么(从后台线程更新UI即使用户更改方向也能正常工作)?谷歌有人提供了一些"官方解决方案"吗?
我正在为Android应用程序工作并使用AsyncTask类实现ProgressBar.
问题是在某些设备上,它会导致"CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图." 在onPostExecute中.在这些设备上,问题发生在100%.在其他设备上,它工作正常.
public final class MyAsyncTask extends AsyncTask<String, Integer, String>
{
private ProgressBar progress;
private ListActivity activity;
public MyAsyncTask(ListActivity activity, ProgressBar progress)
{
this.progress = progress;
this.activity = activity;
}
protected void onPreExecute()
{
this.progress.setVisibility(view.VISIBLE);
}
protected String doInBackground(String[] arg0)
{
// getting xml via httpClient
return string;
}
protected void onPostExecute(String result)
{
this.progress.setVisibility(view.GONE);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么onPostExecute不能在那些特定设备上的UI线程上运行.
接下来,我尝试用runOnUiThread调用它,以确保它在UI线程上运行.
runOnUiThread(new Runnable() {
@Override
public void run() {
ProgressBar progress = (ProgressBar)findViewById(R.id.some_view_progressbar);
MyAsyncTask task = new MyAsyncTask(activity, progress);
task.execute();
}
} …Run Code Online (Sandbox Code Playgroud)