android.view.ViewRoot$CalledFromWrongThreadException::Error 05-12 11:56:45.793: ERROR/AndroidRuntime(505):由:引起,只有创建视图层次结构的原始线程才能触摸其视图。
我做了什么,
我的活动中有一个列表视图,我需要通过执行以下操作来填充列表视图:mylistview.setAdapter(new CustomAdapter());
现在我的UI线程已经承受了太多的压力,所以,考虑在AsynTask中调用这个方法。
另一个问题
当用户单击按钮填充列表视图时,有一个进度对话框显示在我的活动中。当我将所有内容放在一个线程中时,进度对话框将不会显示。我问了一个关于堆栈溢出的问题,为什么进度对话框没有显示,我得到了一个答复,说我需要把所有额外的任务放在另一个线程中。
我还读过安卓开发人员网站上给出的安卓中的更新UI:,但在那里,我们所做的就是创建一个新的可运行程序,并将运行程序发布到UI线程的处理程序中,这样当UI空闲时,runnable就会被执行。但是,上述这些如何解决我的目的呢?我的意思是UI线程仍然在执行指令。
唯一能承受UI线程负载的方法是,如果我创建另一个线程并将所有的工作放在那里.但是android不允许这样做?
提前谢谢你。
发布于 2011-05-12 06:43:34
Android确实允许您将额外的工作放在不同的线程中,并使用AsyncTask在UI线程上发布结果。将UI更新阶段添加到onPostExecute()方法的AsyncTask中,您应该会做得很好。onPostExecute()是在UI线程上执行的,AsyncTask文档中的示例是一个很好的例子。
另外,如果您正确地构建了应用程序,并且不经常使用图形,那么在应用程序运行期间,UI线程应该不会有太多的工作。在单独的线程上移动不完全绑定到UI的所有内容。AsyncTask是一种非常方便的方法。
发布于 2011-05-12 06:48:50
AsyncTask是解决问题的正确方法。您遇到困难的地方正是要把什么放入AsyncTask。从mylistview.setAdapter();或onProgressUpdate方法调用onPostExecute。所以做这样的事:
void setProgress(Integer progress){ myprogressbar.setValue(progress); }
void setAdapter(CustomAdapter result){ mylistview.setAdapter(result); }
private class LongRunningTask extends AsyncTask<String, Integer, CustomAdapter> {
protected Long doInBackground(String... urls) {
CustomAdapter res = null;
// do all the work to BUILD the custom adapter, calling publishProgress() as progress gets made
publishProgress(<progress value>);
return res;
}
protected void onProgressUpdate(Integer... progress) {
setProgress(progress);
}
protected void onPostExecute(CustomAdapter result) {
setAdapter(result);
}
}这应该可以解决线程问题,并让您设置进度栏。
https://stackoverflow.com/questions/5974211
复制相似问题