2

我有一个类,我在其中编写了一个 AsyncTask 从网络获取 Json。

public class MyAsyncGetJsonFromUrl extends AsyncTask<Void, Void, JSONObject> {
    Context context_;
    String url_;
    List<NameValuePair> params_;

    public MyAsyncGetJsonFromUrl(Context context_, List<NameValuePair> params_, String url_) {
        this.context_ = context;
        this.params_ = params_;
        this.url_ = url_;
    }

    @Override
    protected JSONObject doInBackground(Void... params) {
        JSONObject jObj_ = null;
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url_);
            httpPost.setEntity(new UrlEncodedFormEntity(params_));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            InputStream is_ = httpEntity.getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is_.close();
            String json_ = sb.toString();
            Log.e("JSON", json);

            jObj_ = new JSONObject(json_);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return jObj_;
    }

    protected void onPostExecute(JSONObject jObj_) {
        jObj = jObj_;
    }
}

在这个类中还有一个方法可以将此 Json 对象返回给调用该方法的 Activity。

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
    new MyAsyncGetJsonFromUrl(context, params, url).execute();
    return jObj;
}

现在的问题是在立即启动 AsyncTask 之后调用new MyAsyncGetJsonFromUrl(context, params, url).execute();该行return jObj;并返回 null。所以我想停止执行,直到异步任务完成。并且请不要重复提及这个问题,因为没有其他问题与这种情况完全相同

4

1 回答 1

6

异步任务是异步的。这意味着它们独立于程序当前线程在后台执行(它们在后台线程中运行)。因此,在异步任务完成之前,您不应尝试停止程序的执行。

所以你有2个选择:

  • 在 UI 线程本身而不是在异步任务中运行您的代码

  • 从异步任务onPostExecute()方法中分配您的价值

如果您决定使用异步任务并使用选项 B,那么您可以拥有一些静态变量或类似的东西,JSON 对象的值可以在异步任务结束时分配给这些变量,并且可以在以后访问。您还可以在方法本身中对 JSON 对象进行任何需要执行的后处理onPostExecute()(例如:解析对象并将其显示给用户),因为此方法在异步任务完成其操作后在 UI 线程上运行后台线程。

如果您需要异步任务的返回值,您可以执行以下操作:

jObj = new MyAsyncGetJsonFromUrl(context, params, url).execute().get(); 

在这种情况下,程序将等待计算完成,除非出现异常,例如线程被中断或取消(由于内存限制等)。但一般不建议采用这种方法。异步任务的重点是允许异步操作,您的程序执行不应因此而停止。

返回值将doInBackground()作为参数传递给OnPostExecute()方法。您不必在 onPostExecute 中输入返回值,因为它在 UI 线程本身上执行。只需使用结果并使用它做你需要做的事情。

于 2012-11-02T09:38:57.033 回答