2011-12-27 76 views
0

我在其中一個類上使用AsyncTask,但無法使用onPostExecute方法更新視圖。在主類上,我使用ActionBar將選項卡更改爲結果選項卡。查詢結果將在哪裏以列表格式顯示。我正在使用寧靜的服務,併成功從服務器獲取列表。我正在嘗試更新結果選項卡(位於主類中)以顯示查詢的結果。迄今爲止不成功,任何幫助將不勝感激,謝謝。使用AsyncTask但無法使用onPostExecute方法更新視圖

PS。在更改爲結果選項卡並從服務器獲取列表後,我確實運行了onPostExecute方法,但無法從AsyncTask類更新main中的視圖。我還需要提及的是,我還有onProgressUpdate方法「我只是在日誌貓中輸出一個字符串以確保它被調用」。以及doInBackground方法都可以正常工作,只是無法正確更新視圖。另外,因爲我從不同的類更新main,所以我使listview和adapter成爲靜態的,所以我可以從asyncTask類調用它們,在我看來這是有道理的,但這可能是我錯誤的地方,你可以看到onPostExecute方法。謝謝。

主類onCreate方法:在主類

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     bar = getActionBar(); 
     bar.addTab(bar.newTab().setText("Basic\nSearch").setTabListener(this)); 
     bar.addTab(bar.newTab().setText("Advanced\nSearch").setTabListener(this)); 
     bar.addTab(bar.newTab().setText("Results").setTabListener(this)); 
     //bar.addTab(bar.newTab().setText("Exit").setTabListener(this)); 

     bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowHomeEnabled(true); 
     // remove the activity title to make space for tabs 
     bar.setDisplayShowTitleEnabled(false); 
     bar.setDisplayUseLogoEnabled(false); 
    } 

方法改變標籤,結果標籤和查詢服務器:

public void basicSubmitButton(View view) throws InterruptedException { 
     String query = myBasicEditText.getText().toString(); 
     bar.setSelectedNavigationItem(2); 
     ReadWebpageAsyncTask basicSubmission = new ReadWebpageAsyncTask(); 
     basicSubmission.query(query); 
    } 

的AsyncTask方法的onCreate:

public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.results); 

    } 

onPostExecute方法:

protected void onPostExecute(String result) { 
      Hummedia.myListView = (ListView) findViewById (R.id.lv); 
      Hummedia.myListView.setTextFilterEnabled(true); 
      Hummedia.myListView.clearChoices(); 

       Hummedia.adapter = new ArrayAdapter<String>(ReadWebpageAsyncTask.this, 
         android.R.layout.simple_list_item_1, 
         mediaList); 
       //wait(); 
       Hummedia.myListView.setAdapter(Hummedia.adapter); 
     } 

這裏是堆棧跟蹤輸出時,它試圖通過onPostExecute方法以更新主要的觀點:

12-26 18:21:48.916: D/AndroidRuntime(536): Shutting down VM 
12-26 18:21:48.916: W/dalvikvm(536): threadid=1: thread exiting with uncaught exception (group=0x409951f8) 
12-26 18:21:49.067: E/AndroidRuntime(536): FATAL EXCEPTION: main 
12-26 18:21:49.067: E/AndroidRuntime(536): java.lang.NullPointerException 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.app.Activity.findViewById(Activity.java:1794) 
12-26 18:21:49.067: E/AndroidRuntime(536): at edu.byu.hummedia.ReadWebpageAsyncTask$DownloadWebPageTask.onPostExecute(ReadWebpageAsyncTask.java:132) 
12-26 18:21:49.067: E/AndroidRuntime(536): at edu.byu.hummedia.ReadWebpageAsyncTask$DownloadWebPageTask.onPostExecute(ReadWebpageAsyncTask.java:1) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.os.AsyncTask.finish(AsyncTask.java:602) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.os.Looper.loop(Looper.java:137) 
12-26 18:21:49.067: E/AndroidRuntime(536): at android.app.ActivityThread.main(ActivityThread.java:4340) 
12-26 18:21:49.067: E/AndroidRuntime(536): at java.lang.reflect.Method.invokeNative(Native Method) 
12-26 18:21:49.067: E/AndroidRuntime(536): at java.lang.reflect.Method.invoke(Method.java:511) 
12-26 18:21:49.067: E/AndroidRuntime(536): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-26 18:21:49.067: E/AndroidRuntime(536): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-26 18:21:49.067: E/AndroidRuntime(536): at dalvik.system.NativeStart.main(Native Method) 

回答

0

這是由你的活動不被附加到一個窗口而引起的。 (Activity.java的相關行是getWindow().findViewById(id);。)由於當您點擊啓動AsyncTask的按鈕時切換選項卡視圖,我認爲這是導致問題的原因。

你必須組織你的更新來解決這個問題。嘗試修改AsyncTask來打電話回覆您的活動。在您的活動中,您可以通過覆蓋onAttachedToWindowonDetachedFromWindow來跟蹤窗口附件狀態,並且可以立即進行更改或等待附加。