2015-04-27 115 views
0

我正在使用Async任务类来解析'doInBackground'中的JSON文件,并将结果添加到'onPostExecute'中的列表视图中,但我使用的进度对话框永远不会停止,结果永远不会结束出版。我使用此代码:Android AsyncTask永远不会完成

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

我该如何解决这个问题,并在列表中看到的结果看?

谢谢!

+0

您在mJSONArr那里进行此项检查。它可能是空的。这就是为什么没有任何工作。我不确定你需要mJSONArr在那里。 – ElDuderino

+0

我的确需要这个数组,因为响应给了我一个带有json对象的JSON数组。没有检查也没有工作。 –

回答

1

只要穿上这条线开始后您onPostExecute();

pDialog.dismiss(); 

像这样

@Override 
    protected void onPostExecute(JSONObject jsonObject) { 

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

    .... 
    .... 
    .... Rest of your code 
} 
+1

最佳做法是,您应该检查进度对话框是否显示 –

+0

我的主要目的不只是放弃对话。我仍然看不到发布到列表视图的结果。那就是问题所在。 –

+0

然后问题与您的网络api请检查您的josn响应并张贴在这里。 –

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(); 
     } 
    } 
+0

我的主要目标不只是放弃对话。我仍然看不到发布到列表视图的结果。那就是问题所在。这只是驳回了对话。 –