2012-07-13 59 views
2

我正在使用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 

------------------------------------------------------------------------ 

回答

1

不能从单独的线程触动你View对象,你知道, doInBackground()在单独的线程中运行。所以对ListView的调用将导致抛出异常。将所有View-移动代码移动到onPostExecute()。希望这可以帮助。

+0

谢谢大家..这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

+0

@Kstar,不客气! – Egor 2012-07-13 07:16:44

0

您正尝试从后台线程更改UI,这是不可能的。

  1. 你可以看到进度条,为preExceute正在做的工作细
  2. 在doInBackground您要设置在主活动UI这是不对的适配器。 doInBackground用于后台进程并请注释该函数(@Override)
  3. 调试的某些内容: - 请参阅日志中的错误消息“由于:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触摸的意见” ..This行应实际上已经告诉你,你在做什么错
4

doInBackground()执行其他线程。在doInBackground()中,您尝试更新listViewattlist,它是在UI线程中创建的。这是一个错误,您应该在onPostExecute()方法中更新listViewattlist