2013-08-26 70 views
1

首先,這是一個很好的做法,從異步任務訪問片段的方法?從異步任務訪問片段方法

我有一個異步任務,它會生成一個LatLng列表,用於在我的片段中繪製多段線。但是,如果我嘗試使用getter方法來獲取列表。

public List<LatLng> getList() { 
    return this.list; 
} 

我得到nullpointerexceptions所以我必須片段內執行此,

while(list == null) { // FIXME delay because of this 
    list = getRoute.getList(); 
} 

這違背了其後臺任務的目的。

有沒有一種方法可以從異步任務的post執行方法中調用方法?

@Override 
protected void onPostExecute(OTPResponseUI otpResponse) { 
      Fragment.fragmentsMethod(getList()); 
      mDialog.dismiss(); 
    } 

這樣我可以正確顯示過程對話框,並且不會留下用戶懸而它加載列表。

UPDATE 我試圖調用一個回調像this,但不執行我的片段中的回調函數。

UPDATE2 好吧,我剛剛通過的片段實例的異步任務能夠調用片段的方法。根據您的建議:

在您的自定義AsyncTask類中創建列表對象,然後將它返回給postExecute()方法中的Fragment。您可以通過直接呼籲片段實例(你會得到無論是通過構造的方法做它的工作,感謝

+0

你能把你的'Fragment'實例傳遞給'AsyncTask'的構造函數嗎?另外,你的'AsyncTask'獲取列表以填充它?爲什麼不只是返回在'AsyncTask'中實例化的實例列表? –

+0

@unluddite第一個,我該怎麼做?是的,'AsyncTask'只是用來填補它。我不認爲我可以在'AsyncTask'中返回一個填充列表,我可以嗎?這就是爲什麼我想到調用一種方法。它以前使用活動,'((ActivityName)mContext).method(getList());',我只想使用片段。 – linus

回答

1

您有幾種選擇:!

定義你自己AsyncTask類,並傳遞您想要裝入要麼其構造List

class MyAsyncTask extends AsyncTask<Void,Void,Void> { 
    private List<LatLng> mTheList; 

    public MyAsyncTask(List<LatLng> theList) { 
     mTheList = theList; 
    } 

    // fill the list in doInBackground() 

    ... 
} 

// in your fragment 

MyAsyncTask task = new MyAsyncTask(theList); 
task.execute(); 

OR,你可以把它作爲一個參數傳遞給​​方法:

class MyAsyncTask extends AsyncTask<List<LatLng>,Void,Void> { 
    public Void doInBackgroun(List<LatLng>...args { 
     List<LatLng> theList = args[0]; 
     // fill the list 
    } 
} 

請注意,您也可以通過Fragment實例的​​方法以同樣的方式,然後調用該實例上getList()方法(我不喜歡這個選擇)。

一個更好的選擇是:

創建自定義AsyncTask類列表對象,然後在postExecute()方法將其返回到Fragment。您可以通過直接調用Fragment實例上的方法(您將通過構造函數或​​方法的參數獲得)來接受列表作爲參數。但是,另一種更乾淨的方法是在自定義AsyncTask類中定義一個接口,用於接受填充列表作爲參數的回調方法。然後你的Fragment可以實現這個回調接口,將它自己作爲一個「偵聽器」添加到任務中,並讓任務調用該接口方法,將填充列表作爲任務的方法中的一個擴展。

+0

我傳入一個包含折線選項列表和標記選項列表的類。在類的結果中,我調用了一種方法將折線選項和標記添加到地圖 – danny117

+0

@unluddite,我嘗試了前兩個選項,但在下一個需要列表調用的活動之前,仍然無法獲取列表中的任何項目。你介意如果你放置一個如何實現你所建議的最後一個選項的示例代碼? – linus

+0

根據你的迴應,這聽起來不像最後的選擇會幫助你。這些選項都實現了相同的結果 - 在「AsyncTask」中填充列表並將結果返回給調用者 - 但只是使用不同的樣式/設計。我認爲你需要更詳細地闡述你的意思:在下一個活動需要列表被調用_之前,無法獲得列表中的任何項目。如果您需要等待'AsyncTask'結果,那麼在'onPostExecute()'運行之前不要開始下一個活動。 –