簡體   English   中英

當活動中的asynctask完成時,如何重新加載片段中的ui?

[英]When asynctask in activity finishes how to reload ui in fragment?

我的活動加載一個片段並啟動一個AsyncTask。

 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中)?

onPostExecute已經在UIThread中運行,因此您只需要片段即可調用Activity。 我通常這樣做的方法是為片段定義接口。 像這樣:

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的活動中使用此片段,則會拋出異常

創建片段時,您有他的一個實例,因此您可以執行onPostExecute來調用片段上的方法

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

在片段中定義所需的方法以更新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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM