2013-07-12 54 views
2

當我打電話listview.setAdapter(adapter);從的AsyncTask的onPostExecute()方法,我得到這個錯誤:

07-12 19:29:38.147: E/AndroidRuntime(8478): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

*注:此崩潰只發生在API級別10,但不是在最新的API(在API 17這個運行精細)。

這是onPostExecute():

@Override 
     protected void onPostExecute(String[] result) { 
      super.onPostExecute(result); 
      // TODO: check this.exception 
      er=result;//er is a global variable 
      gff=true;//gff is a global variable 
      asynchelp(er);//function in the UI thread 
      myPd_ring.dismiss();//dismissing a spinning ring 
     } 

asynchelp()低於:

public void asynchelp(String[] er){ 
     String iamoutofnames[]=null; 
     for(int q = 0; q <er.length; q++){ 
      HashMap<String, String> map = new HashMap<String, String>(); 
     iamoutofnames=null; 
     int len; 
     if(er[q].contains("sandy")){ 
      //calculations 
      map.put("col_1", iamoutofnames[len]); 
     }else{ 
      //calculations 
     map.put("col_1", iamoutofnames[1]); 
      } 
     fillMaps.add(map); 
     lv.setOnItemClickListener(onListClick); 
    } 
    SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, R.layout.grid_item, from, to); 
    lv.setAdapter(adapter);//CRASHES ON THIS LINE************** 

} 

什麼是錯的代碼?

編輯:堆棧跟蹤:

07-12 19:29:37.996: W/System.err(8478): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
07-12 19:29:37.996: W/System.err(8478):  at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
07-12 19:29:38.006: W/System.err(8478):  at android.view.ViewRoot.invalidateChild(ViewRoot.java:642) 
07-12 19:29:38.006: W/System.err(8478):  at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668) 
07-12 19:29:38.006: W/System.err(8478):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511) 
07-12 19:29:38.006: W/System.err(8478):  at android.view.View.invalidate(View.java:5279) 
07-12 19:29:38.006: W/System.err(8478):  at android.widget.AbsListView.resetList(AbsListView.java:1150) 
07-12 19:29:38.006: W/System.err(8478):  at android.widget.ListView.resetList(ListView.java:511) 
07-12 19:29:38.006: W/System.err(8478):  at android.widget.ListView.setAdapter(ListView.java:440) 
07-12 19:29:38.006: W/System.err(8478):  at com.example.kiva.ListViewA.asynchelp(ListViewA.java:519) 
07-12 19:29:38.006: W/System.err(8478):  at com.example.kiva.ListViewA$RetreiveFeedTask.onPostExecute(ListViewA.java:1330) 
07-12 19:29:38.006: W/System.err(8478):  at com.example.kiva.ListViewA$RetreiveFeedTask.onPostExecute(ListViewA.java:1) 
07-12 19:29:38.006: W/System.err(8478):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
07-12 19:29:38.006: W/System.err(8478):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
07-12 19:29:38.006: W/System.err(8478):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
07-12 19:29:38.016: W/System.err(8478):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-12 19:29:38.016: W/System.err(8478):  at android.os.Looper.loop(Looper.java:130) 
07-12 19:29:38.016: W/System.err(8478):  at android.os.HandlerThread.run(HandlerThread.java:60) 

07-12 19:29:40.096: W/FlurryAgent(8478): onEndSession called without context from corresponding onStartSession 
07-12 19:29:40.206: E/WindowManager(8478): Activity com.example.kiva.ListViewA has leaked window [email protected] that was originally added here 
07-12 19:29:40.206: E/WindowManager(8478): android.view.WindowLeaked: Activity com.example.kiva.ListViewA has leaked window [email protected] that was originally added here 
07-12 19:29:40.206: E/WindowManager(8478): at android.view.ViewRoot.<init>(ViewRoot.java:258) 
07-12 19:29:40.206: E/WindowManager(8478): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
07-12 19:29:40.206: E/WindowManager(8478): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
07-12 19:29:40.206: E/WindowManager(8478): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.Dialog.show(Dialog.java:241) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ProgressDialog.show(ProgressDialog.java:107) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ProgressDialog.show(ProgressDialog.java:90) 
07-12 19:29:40.206: E/WindowManager(8478): at com.example.kiva.ListViewA.topfeeds(ListViewA.java:1598) 
07-12 19:29:40.206: E/WindowManager(8478): at com.example.kiva.ListViewA.onCreate(ListViewA.java:278) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
07-12 19:29:40.206: E/WindowManager(8478): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-12 19:29:40.206: E/WindowManager(8478): at android.os.Looper.loop(Looper.java:130) 
07-12 19:29:40.206: E/WindowManager(8478): at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-12 19:29:40.206: E/WindowManager(8478): at java.lang.reflect.Method.invokeNative(Native Method) 
07-12 19:29:40.206: E/WindowManager(8478): at java.lang.reflect.Method.invoke(Method.java:507) 
07-12 19:29:40.206: E/WindowManager(8478): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-12 19:29:40.206: E/WindowManager(8478): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-12 19:29:40.206: E/WindowManager(8478): at dalvik.system.NativeStart.main(Native Method) 
+0

我最好的猜測是,你創建的'ListView'背景上線程,並沒有將它添加到視圖層次結構中。 – CommonsWare

+0

@CommonsWare ListView是在UI線程本身的'onCreate()'函數中創建的。此外,此代碼在API級別17上完美工作,這意味着我的代碼違反了API級別10中的某些限制..? –

+0

@CommonsWare另外,當我繞過這個asynctask並將一些虛擬值傳遞給適配器時,它完美地工作。 –

回答

1

這是我在asynchelp();用於解決錯誤:

runOnUiThread(new Runnable() { 
     public void run() { 
    lv.setAdapter(adapter);//lv needs to be declared as final 
     } 
    });