Android碎片和线程
问题描述:
我正在使用FragmentActivity
来交换两个选项卡。这是选项卡A和选项卡B.在选项卡B我使用ListView
与Loadmore按钮,当假设加载更多按钮点击我只是称为backgroud线程。Android碎片和线程
private class loadMoreListView extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Showing progress dialog before sending http request
pDialog = new ProgressDialog (
getActivity());
pDialog.setMessage("Please wait..");
pDialog.setIndeterminate(true);
pDialog.setCancelable(false);
pDialog.show();
}
protected Void doInBackground(Void... unused) {
try {
//service url to fectch data..
//xml parsing
} catch (Exception e) {
response = "failure";
System.out.println(" sec XML Pasing Excpetion = " + e);
}
int currentPosition = listViewattlist.getFirstVisiblePosition();
// Appending new data to menuItems ArrayList
adapter = new CustomAdapter(getActivity(), R.layout.att_list, R.id.title, data);
listViewattlist.setAdapter(adapter);
// Setting new scroll position
listViewattlist.setSelectionFromTop(currentPosition + 1, 0);
return (null);
}
protected void onPostExecute(Void unused) {
// closing progress dialog
pDialog.dismiss();
}
}
当我换,并点击该按钮,我能看到进度条,但它显示如下错误:
07-13 11:42:29.386: E/AndroidRuntime(894): FATAL EXCEPTION: AsyncTask #2
07-13 11:42:29.386: E/AndroidRuntime(894): java.lang.RuntimeException: An error occured while executing doInBackground()
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.lang.Thread.run(Thread.java:856)
07-13 11:42:29.386: E/AndroidRuntime(894): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4607)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:867)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4066)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10250)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.invalidate(View.java:10205)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.invalidateDrawable(ImageView.java:190)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.graphics.drawable.Drawable.setVisible(Drawable.java:546)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ImageView.onDetachedFromWindow(ImageView.java:1173)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.View.dispatchDetachedFromWindow(View.java:11789)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2532)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:3819)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.AbsListView.resetList(AbsListView.java:1936)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.resetList(ListView.java:502)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.widget.ListView.setAdapter(ListView.java:442)
07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:372)
07-13 11:42:29.386: E/AndroidRuntime(894): at com.owentech.testswipeab.TabTwo$loadMoreListView.doInBackground(TabTwo.java:1)
07-13 11:42:29.386: E/AndroidRuntime(894): at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-13 11:42:29.386: E/AndroidRuntime(894): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-13 11:42:29.386: E/AndroidRuntime(894): ... 5 more
------------------------------------------------------------------------
答
不能从单独的线程触动你View
对象,你知道, doInBackground()
在单独的线程中运行。所以对ListView
的调用将导致抛出异常。将所有View
-移动代码移动到onPostExecute()
。希望这可以帮助。
答
您正尝试从后台线程更改UI,这是不可能的。
- 你可以看到进度条,为preExceute正在做的工作细
- 在doInBackground您要设置在主活动UI这是不对的适配器。 doInBackground用于后台进程并请注释该函数(@Override)
- 调试的某些内容: - 请参阅日志中的错误消息“由于:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触摸的意见” ..This行应实际上已经告诉你,你在做什么错
答
doInBackground()
执行其他线程。在doInBackground()
中,您尝试更新listViewattlist
,它是在UI线程中创建的。这是一个错误,您应该在onPostExecute()
方法中更新listViewattlist
。
谢谢大家..这alsoi想包括在我的代码,因为我ruuning在4.0 SDK静态{ \t \t \t如果(android.os.Build.VERSION.SDK_INT> 14) \t \t \t { \t \t \t StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()。permitAll()。build(); \t \t \t StrictMode.setThreadPolicy(policy); \t \t \t} \t \t \t}这看起来更高os版本4.0 emultor。 – Kstar 2012-07-13 07:15:51
@Kstar,不客气! – Egor 2012-07-13 07:16:44