【问题标题】:Android AsyncTask never finishesAndroid AsyncTask 永远不会完成
【发布时间】:2015-04-27 10:59:06
【问题描述】:

我正在使用 Async 任务类来解析“doInBackground”中的 JSON 文件并将结果添加到“onPostExecute”中的列表视图中,但我使用的进度对话框从未停止,结果也从未发布。我正在使用此代码:

public class JSONTask extends AsyncTask<String,String,JSONObject>
{
    private ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(AnswerActivity.this);
        pDialog.setMessage("Getting Answers ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected JSONObject doInBackground(String... params) {
        try {
            answersJson = makeRequest(requestUrl);
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return answersJson;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        try {
            if(mJSONArr!=null){
            mJSONArr = jsonObject.getJSONArray("items");
            for(int i=0;i<mJSONArr.length();i++)
            {
                String val = null;
                ob2 = mJSONArr.getJSONObject(i);
                if(ob3!=null){ob3 = ob2.getJSONObject("owner");}
                answers[i] = new Answer(ob2.getString("body"),ob3.getString("display_name"),ob2.getString("score"));
            }
            adapter = new AnswersAdapter(AnswerActivity.this,
                    R.layout.answer_list_item, answers);
            answerList.setAdapter(adapter);
            pDialog.dismiss();}
            //url = "https://api.stackexchange.com/2.2/search?order=desc&sort=activity&";
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

这是 makeRequest 函数:

private JSONObject makeRequest(String url) throws IOException, JSONException {

        JSONObject response;
        String jsonString;

        HttpClient httpclient = new DefaultHttpClient();

        // create the request
        HttpUriRequest request = new HttpGet(url);
        request.addHeader("Accept-Encoding", "gzip");

        // execute the request
        HttpResponse resp = httpclient.execute(request);
        StatusLine statusLine = resp.getStatusLine();

        // check the request response status. Should be 200 OK
        if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
            Header contentEncoding = resp.getFirstHeader("Content-Encoding");
            InputStream instream = resp.getEntity().getContent();
            // was the returned response gzip'ed?
            if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                instream = new GZIPInputStream(instream);
            }

            BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
            StringBuilder responseString = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                responseString.append(line);
            }
            jsonString = responseString.toString();
            response = new JSONObject(jsonString);
        } else {
            resp.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }

        return response;
    }

如何解决这个问题并在列表视图中查看结果?

谢谢!

【问题讨论】:

  • 你在那里用 mJSONArr 进行了检查。它可能是空的。这就是为什么似乎没有任何效果。我不确定你是否需要 mJSONArr。
  • 我确实需要该数组,因为响应返回给我一个 JSON 数组,其中包含 json 对象。没有检查也没有用。

标签: android json android-asynctask progressdialog


【解决方案1】:

这可能会对您有所帮助。 将onPostExecute 替换为

 @Override
    protected void onPostExecute(JSONObject jsonObject) {
        if(pDialog!=null && pDialog.isShowing())
        {
            pDialog.dismiss();
        }

        try {
            if(mJSONArr!=null){
            mJSONArr = jsonObject.getJSONArray("items");
            for(int i=0;i<mJSONArr.length();i++)
            {
                String val = null;
                ob2 = mJSONArr.getJSONObject(i);
                if(ob3!=null){ob3 = ob2.getJSONObject("owner");}
                answers[i] = new Answer(ob2.getString("body"),ob3.getString("display_name"),ob2.getString("score"));
            }
            adapter = new AnswersAdapter(AnswerActivity.this,
                    R.layout.answer_list_item, answers);
            answerList.setAdapter(adapter);
          }
            //url = "https://api.stackexchange.com/2.2/search?order=desc&sort=activity&";
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

【讨论】:

  • 我的主要目标不仅仅是关闭对话框。我仍然没有看到发布到列表视图的结果。那就是问题所在。这只是关闭对话框。
【解决方案2】:

在你的onPostExecute();开始后加入这一行

pDialog.dismiss();

这样

 @Override
    protected void onPostExecute(JSONObject jsonObject) {

    if( pDialog!=null &&  pDialog.isShowing())
        pDialog.dismiss();

    ....
    ....
    .... Rest of your code
}

【讨论】:

  • 最佳实践是,您应该检查进度对话框是否显示
  • 我的主要目标不仅仅是关闭对话框。我仍然没有看到发布到列表视图的结果。这就是问题所在。
  • 那么您的 web-api 有问题,请检查您的 josn 回复并在此处发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多