簡體   English   中英

僅在完成AsyncTask中的doInBackground之后執行某些操作

[英]Perform something only after completing doInBackground in AsyncTask

在我AsyncTask我里面相當長的操作doInBackground()其完成后的值賦給變量doInBackground() 我使用該變量的值在postExecute()設置用戶界面的一部分。 問題在於doinbackground()是一個很長的操作, postExecute()首先完成。 這樣我就無法獲得價值。

這是問題所在

private class bigwork extends AsyncTask<String, Void, Boolean> {
    String foo = null;

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Boolean doInBackground(final String... args) {
        // Long operation sets variable 'foo' a new value
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        // Make use of foo here
    }

問題是我在postExecute()獲取的foo的值仍然為null

通常,您會將字符串直接傳遞給onPostExecute:

private class bigwork extends AsyncTask<String, Void, String>
{

@Override
protected void onPreExecute() {
    }

 @Override
    protected Boolean doInBackground(final String... args) {
// Long operation
set variable 'foo' a new value
    return foo;
}

@Override
    protected void onPostExecute(String foo) {
    if (foo != null) {
        // success
    } 
// Make use of foo here
}

您應該將參數直接傳遞給onPostExecute。 引用《 Android開發人員參考》

protected void onPostExecute(結果結果)在doInBackground(Params ...)之后在UI線程上運行。 指定的結果是doInBackground(Params ...)返回的值。

如果需要傳遞多個參數,可以將它們包裝在一個類中,例如:

public class MyClass
{
    public String string1;
    public String string2;

    public MyClass(String a, String b){
        string1 = a;
        string2 = b;
    }
}

希望這可以幫助。

最好的祝福。

在doInBackground()函數完成之后,重寫onPostExecute()函數以執行某些任務。

@Override
protected String doInBackground(String... arg0) {
    // TODO Auto-generated method stub
    ServiceHandler sh = new ServiceHandler();
    jsonStr=sh.makeServiceCall(arg0[0], ServiceHandler.GET);
    return null;
}
@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    Log.i("jsin", jsonStr);
    if(pd.isShowing()){
        pd.dismiss();
        }
    try {
        js = new JSONObject(jsonStr);
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    JSONArray results =null;
    try {
        results = js.getJSONArray("results");
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    for(int i = 0; i< results.length();i++)
    {
        JSONObject c = null;
        try {
            c = results.getJSONObject(i);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            placeName = c.getString(TAG_NAME);
            ratings = c.getDouble(TAG_RATING);
            HashMap<String, String> rest = new HashMap<String, String>();
            rest.put(TAG_NAME, placeName);
            rest.put(TAG_RATING, ratings+"");
            placeList.add(rest);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    ListAdapter adapter  = new SimpleAdapter(getActivity().getApplicationContext(), placeList, R.layout.list_item, new String[]{TAG_NAME}, new int[]{R.id.list_text});
    lv.setAdapter(adapter);
}

我在doInBackground中發出http請求,成功回復后,我在onPostExecute()中解析json並顯示在列表視圖中,顯然此代碼在擴展AsyncTask類的類中。

暫無
暫無

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

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