为什么onPostExecute在doInBackground在AsyncTask中完成之前执行

时间:2012-10-13 03:55:42

标签: android android-asynctask

我试图创建一个AsyncTask来从服务器端获取一些数据。但它在onPostExecute()行中报告Null指针异常" IOUtils.copy((response_.getEntity()。getContent()),writer);"我使用一些日志来查看发生了什么,发现日志1和3被打印但log 2没有。为什么在client.executed()完成之前执行了onPostExecute?任何人都可以提出一些建议吗?

private class GetForm extends AsyncTask<String, Integer, Object> {
    private HttpResponse response_;
    private Exception exception_;
    private String url_;

    public GetForm(String url) {
        super();
        url_ = url;
    }
    protected Object doInBackground(String... params) {
        try {
            Log.i("mylog","inside doInbackground 1.");
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(url_);
            response_ = client.execute(request);
                            Log.i("mylog","inside doInbackground 2.");

        } catch (Exception e) {
            exception_ = e;
        }
        return response_;
    }
    @Override
    protected void onPostExecute(Object o) {
        // Your current UI stuff here.
        Log.i("mylog","inside onPostExecute 3.");
        StringWriter writer = new StringWriter();
        try{
            IOUtils.copy((response_.getEntity().getContent()), writer);
        ......

        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:5)

首先调用onPostExecute()是不太可能的,并且更有可能在doInBackground()中抛出异常..以及为什么不打印Log 2。检查LogCat中的警告或调试页面。此外,您应该单独打印两个例外。

答案 1 :(得分:1)

onPostExecute()完成之前,

doInBackground()永远不会执行。

您必须知道,无论您调用什么,只有doInBackground()在异步线程/任务中执行。并且onPostExecute()将在主UI线程本身中执行。

演示如何在代码中调用此任务。

您必须检查的主要事项是,除非您确定AsyncTask已完成,否则您不得使用从主UIThread中的Asynctask获取的任何数据。

因为有可能在AsyncTask完成之前执行,所以在这种情况下你肯定会得到NULLException