只有在AsyncTask中完成doInBackground后才能执行某些操作

时间:2014-07-20 08:43:30

标签: java android android-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
    }

问题是我foo postExecute()的价值仍为null

3 个答案:

答案 0 :(得分:0)

通常你会将String直接传递给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
}

答案 1 :(得分:0)

您应该将参数直接传递给onPostExecute。引自Android Developer Reference

  

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;
    }
}

希望这有帮助。

最好的问候。

答案 2 :(得分:0)

覆盖onPostExecute()函数,在doInBackground()函数完成后执行一些任务。就像这样:

@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并在listview中显示,显然这段代码在类中扩展了AsyncTask类。

相关问题