0

我的活動加載一個片段並啓動一個AsyncTask。當活動中的asynctask完成如何重新加載ui的片段?

class GetParkingAreasAsync extends AsyncTask<String, String, String> { 


    @Override 
    protected String doInBackground(String... args) { 

     return mRepository.getParkingAreas(mContext.getActiveUser()); 
    } 

    @Override 
    protected void onPostExecute(String value) { 
     for (int i=0; i<mContext.getActiveUser().getParkingAreas().size(); i++){ 
      Log.i(TAG_areas, "parking area " + i +": " + mContext.getActiveUser().getParkingAreas().get(i).getName()); 
     } 
    } 
} 

活動中的這個Asynctask加載了一些數據(我存儲在上下文中)。完成後,如何重新加載片段中的UI以顯示加載的數據(在父Activity中)?

回答

1

的onPostExecute已經運行在UIThread,所以你只需要你的片段打電話給你的活動。我通常這樣做的方式是爲片段定義一個接口。 像這樣:

public interface YourFragmentListener { 
    void onParksLoaded(List<String> names) 
} 

然後在你的活動:

public class YourActivity implements YourFragmentListener { 

    @Override 
    void onParksLoaded(List<String names) { 
     // Do something with the names 
     yourField.setText(names.get(0)) 
    } 

} 

最後,在你的片段,你可以使用它像這樣:

@Override 
protected void onPostExecute(String value) { 
    ((YourFragmentListener) getActivity()).onParksLoaded(value) 
} 

當然你也可以改變類型,以更好地適合你的用例。如果你在一個沒有實現YourFragmentListener的活動中使用這個片段,它會拋出一個異常

+0

作品像魅力一樣,謝謝 –

0

當您創建的片段,你有他的一個實例 所以你可以做的是onPostExecute調用的方法在你的片段

@Override 
protected void onPostExecute(String value) { 
yourFragment.doSomething() 
} 
+0

我不能那樣做,因爲我無法從onPostExecute調用非靜態方法(getView()和getContext()都是非靜態方法)。我在該方法中有另一個任務無法加載。 –

+0

爲什麼不呢? 位於你班上的異步任務? – Yoni

+0

第二個asynctask位於片段中,用於從ImageView上加載URL中的圖像 –

0

定義在該片段中您想要的方法來更新UI,當異步工作完成後,在父活動搜索片段,並呼籲

MyFragment的片段實例的方法:

public void refreshUI(String data) { 
    //Do something with data you receive  
} 

ParentActivity:

@Override 
protected void onPostExecute(String value) { 
    //or you can find it with tag if have any 
    MyFragment frag = getFragmentManager().findFragmentById(R.id.container); 
    if(frag != null) frag.refreshUI(value); 
} 
相關問題