2013-04-17 76 views
0

我正在調用一個正在主線程上執行網絡操作的類,導致我的應用程序在更新的設備上爆炸。所以我試着將呼叫轉移到我的主要活動中的AsyncTask內部類中。但是現在我得到空引用期待。無法使異步任務工作

這裏是我的AsyncTask:

 private class RetreiveAmazonNodesXML extends AsyncTask { 

     private Exception exception; 

     @Override 
     protected Object doInBackground(Object... params) { 
       try { 
        childrenBrowseNodesXml = new Amazon(browseNodeId, locality); 

       } catch (Exception e) { 
        this.exception = e; 
       } 
      return null; 
     } 


    } 

這裏的地方我把它在我的活動:

RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML(); 
test.execute(); 
parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML()); 

childrenBrowseNodesXml是沒有得到更新,並返回null。我知道我的亞馬遜課程正常工作,所以它與我AsyncTask做的事情,但我不知道?

+0

看看我的例子這裏瞭解如何執行異步任務,以及如何獲得它的結果在回調函數:http://stackoverflow.com/questions/13713751/json-object-null-android-asynctask/13713852#13713852 – lahsrah

+0

你的代碼阻止你查看是否有拋出的異常。把一些日誌記錄在你的catch異常(或更好的,[刪除此](http://stackoverflow.com/questions/21938/is-it-really-that-bad-to-catch-a-general-exception))。 – m0skit0

+0

傳遞通用標籤,類RetreiveAmazonNodesXML擴展AsyncTask 。 –

回答

1

這是因爲您試圖使用AsyncTask尚未返回的值,因爲AsyncTask正在以異步方式運行

你應該把parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());到您AsyncTaskonPostExecute()方法,像這樣:

private class RetreiveAmazonNodesXML extends AsyncTask { 

    private Exception exception; 

    @Override 
    protected Object doInBackground(Object... params) { 
      try { 
       childrenBrowseNodesXml = new Amazon(browseNodeId, locality); 

      } catch (Exception e) { 
       this.exception = e; 
      } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object obj) { 

      parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML()); 

    } 

} 

此外,return nulldoInBackground方法可能不是一個很好的方式,東西,doInBackground收益將作爲參數傳遞通過AsyncTask自動生成onPostExecute()方法。

欲瞭解更多有關AsyncTask,請參閱Android Developers: AsyncTask

+0

這沒有竅門謝謝!應該知道這將是多線程再次搞亂我的代碼。必須添加更多的代碼到onPostExecute,現在已經導致了一個微調問題沒有更新......歐! – KingFu

0

問題是,您創建後臺線程(AsyncTask),它會在一段時間後(實際執行時)填充childrenBrowseNodesXml,但您嘗試立即在活動代碼中使用它。

將您的parseXMLFile移動到onPostExecute(Void result) AsyncTask方法。

2

使用回調從異步任務中獲取結果。在此界面回調類:

public interface Callback { 
    public void onSuccess(Object data); 
    public void onError(String errorMsg); 
} 

而創建實例這一類,並實現它:

final Callback resCallback = new Callback() { 
    @Override 
public void onSuccess(Object data) { 
    parseXmlFile(data); 
} 

@Override 
public void onError(String errorMsg) { 
    //show error with Alert or Toast 
} 
}; 

而創建的AsyncTask類回調:

RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML(resCallback); 
test.execute(yourObjectsParams); 

寫的AsyncTask類是這樣的:

private class RetreiveAmazonNodesXML extends AsyncTask { 
    private Callback responderCallback; 
    private Exception exception; 

    public GeneralHttpTask(Callback callback){ 
     this.responderCallback = callback; 
    } 

    @Override 
    protected Object doInBackground(Object... params) { 
      try { 
       Amazon childrenBrowseNodesXml = new Amazon(browseNodeId, locality); 
       return childrenBrowseNodesXml; 
      } catch (Exception e) { 
       this.exception = e; 
      } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     if(result != null) { 
      responderCallback.onSuccess(result); 
     } else { 
      responderCallback.onError(exception); 
     } 
    } 
} 
+0

感謝您的回答。想知道當AsyncTask提供onPostExecute()時,回調接口的好處是什麼? – KingFu

+0

例如,您希望在更多活動中使用通用AsyncTask類,那麼您需要創建一個通用的AsyncTask類併發送它的url和回調函數,當回調函數出現時,您將使用結果。如果你想單獨創建AsyncTask類 –