2014-09-04 57 views
-2

试图读取和解析我的应用程序中的一些json数据。我实现了解析器类扩展的AsyncTask如下:NetworkOnMainThreadException

public class JSONParser extends AsyncTask<Void, Void, String> { 
    private String strUrl; 
    private List<NameValuePair> params; 
    private String result; 
    private String response; 
    public static final String RESULT_SUCCESS = "success"; 
    public static final String RESULT_FAILED = "failed"; 

    public JSONParser(String strUrl, List<NameValuePair> params) { 
     this.strUrl = strUrl; 
     this.params = params; 
    } 

    private void parse() { 
     try { 
      // Create a new HttpClient and Post Header 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(strUrl); 

      // Add parameters 
      if (params != null) { 
       httppost.setEntity(new UrlEncodedFormEntity(params)); 
      } 

      // Execute HTTP Post Request 
      HttpResponse httpResponse = httpclient.execute(httppost); 

      // return by response 
      result = RESULT_SUCCESS; 
      this.response = EntityUtils.toString(httpResponse.getEntity(), "UTF-8"); 

     } catch (Exception e) { 
      result = RESULT_FAILED; 
      this.response = null; 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String doInBackground(Void... params) { 
     parse(); 
     return response; 
    } 

    public String getResult() { 
     return result; 
    } 

    public String getResponse() { 
     return response; 
    } 
} 

它运作良好,在以后的Android版本,但不幸的是它抛出旧版本NetworkOnMainThreadException。 我搜索了,发现我应该在我的应用程序中使用严格模式,但线程的性能变得非常糟糕!当我点击解析按钮时,它会冻结! 你能帮助我更好的解决方案吗?

+1

如何初始化JSONParser?你打电话给哪些方法?我给你一个提示。它不是'new JSONParser(strurl,params).execute();' – stealthjong 2014-09-04 10:22:38

+0

JsonParser parser = new JsonParser(strUrl,params); parser.doInBackground(); – 2014-09-04 10:25:22

+1

@MahmoudElshamy“从不”显式调用doInBackground()。它不应该被手动调用。 – Jitsu 2014-09-04 10:33:19

回答

3

打电话给你这样的班级,它会解决你的问题!

new JSONParser().execute(); 
+0

它的工作原理,谢谢 – 2014-09-04 11:21:22

相关问题