【问题标题】:how to use Json parser android?如何使用Json解析器android?
【发布时间】:2013-11-14 10:08:46
【问题描述】:

我将下面给出的解析器与示例 Android 2.2 一起使用。我的例子正在工作,我没有问题。当尝试在使用 Android 4.3 的项目中使用某些示例时。但我的解析器行有问题

HttpResponse httpResponse = httpClient.execute(httpPost);

我检查了清单中的所有权限,所有权限都已使用。

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            Log.d("test url" , "le request est lancé") ;
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            Log.d("test url" , "la connection etablie");
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

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

        try {
            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();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

日志是:

11-14 10:48:38.590: ERROR/AndroidRuntime(3801): FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.web.tab/fr.web.profilconfiguration.AndroidJSONParsingActivity}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
        at android.app.ActivityThread.access$600(ActivityThread.java:123)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4424)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
        at java.net.InetAddress.getAllByName(InetAddress.java:220)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
        at fr.web.profilconfiguration.JSONParser.getJSONFromUrl(JSONParser.java:44)
        at fr.web.profilconfiguration.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:62)
        at android.app.Activity.performCreate(Activity.java:4465)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

【问题讨论】:

标签: android json android-parser


【解决方案1】:

不要在主线程中使用网络活动。此异常仅针对面向 Honeycomb SDK 或更高版本的应用程序引发。在单独的线程中执行所有与网络相关的任务。你的问题会得到解决的。

【讨论】:

    【解决方案2】:
    Caused by: android.os.NetworkOnMainThreadException
    

    您正在 ui 线程上运行网络相关操作。

    HttpResponse httpResponse = httpClient.execute(httpPost);
    

    以上语句必须在thread或asynctask doInbackground中。

    http://developer.android.com/reference/android/os/AsyncTask.html

    在ui线程new TheTask().execute()调用asynctask

    class TheTask extends AsyncTask<Void ,Void, Void>{
    
            @Override
            protected Void doInBackground(Void... params) {
                       JSONObject jobject =getJSONFromUrl(String url);
                return null;
    
            }
        }
    

    【讨论】:

    • 你能解释一下吗?在我的解析器中什么是参数?
    • 这与 var args google 相同。即 asynctask 的 doinbackground 并将您的网络相关代码移动到 doinbackground。
    • @user2043602 是什么让你认为接受答案是解决方案,请看这里developer.android.com/reference/android/os/StrictMode.html
    • @user2043602 blog.vogella.com/2011/04/04/android-strictmode。 StrictMode 应该只在开发过程中使用,而不是在您的实时应用程序中。所以我想知道是什么让你接受了另一个答案?
    【解决方案3】:

    您正在主线程中进行网络工作,这就是为什么会出现此错误。 对于开发过程,您使用它而不是实时应用程序。

    在 setcontentView(layout) 之后的 oncreate 方法中将此代码放入您的 Activity 中

    if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    

    【讨论】:

    【解决方案4】:
    Caused by: android.os.NetworkOnMainThreadException
    

    你不能在主线程上使用HttpResponse。您必须使用 AsyncTask 从 Web 获取 Json。

    阅读本文;

    http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

      【解决方案5】:
      public static JSONObject responseForSignin(final String uname,final String pwd) {
      
               JSONObject jsonResponse = null;
              HttpParams httpParameters = new BasicHttpParams();
              int connectionTimeout = 1000*12;
              int socketTimeout = 1000*13;
              HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeout);
              HttpConnectionParams.setSoTimeout(httpParameters, socketTimeout);
              // Create a new HttpClient and Post Header
              HttpClient httpClient = new DefaultHttpClient(httpParameters);
              HttpPost httpPost = new HttpPost("URL");
              httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
      
              try {
                  // Add your data
      
                  List<NameValuePair> signinDetails = new ArrayList<NameValuePair>();
                  signinDetails.add(new BasicNameValuePair("name", uname));
                               signinDetails.add(new BasicNameValuePair("pwd", pwd));
                  httpPost.setEntity(new UrlEncodedFormEntity(signinDetails));
                  // Execute HTTP Post Request
                  HttpResponse httpResponse = httpClient.execute(httpPost);
                  Log.v("Post Status", "Code: "+ httpResponse.getStatusLine().getStatusCode());
                  responseCode = httpResponse.getStatusLine().getStatusCode();
                      Log.e("responseCode", String.valueOf("response code"+responseCode));
                      HttpEntity entity = httpResponse.getEntity();
                      Log.e("entity", String.valueOf(entity));
                      if (entity != null) {
      
                          if (entity != null) {
      
                              String responseBody = EntityUtils.toString(entity);
                              JSONTokener jsonTokener = new JSONTokener(responseBody);
                              jsonResponse = new JSONObject(jsonTokener);
                              JSONObject response = jsonResponse.getJSONObject("response");
                              // Getting String inside response object
                              String status = response.getString("status");
                              String message = response.getString("message");
      
                          }
                      } // if (entity != null) end
              } 
      
              catch (SocketException seExp) 
              {
      
              }
              catch (ConnectTimeoutException cteExp) 
              {
              // TODO Auto-generated catch block
      
              }
              catch (ClientProtocolException cpeExp) {
                  // TODO Auto-generated catch block
              } 
      
                catch (UnknownHostException e) {
                      // TODO Auto-generated catch block
      
                      e.printStackTrace();
                  }
              catch (Exception allExp) {
                  // TODO Auto-generated catch block
              }       
              return jsonResponse;
          }
      

      试试这个

      public class RequestLogInFromServer extends AsyncTask<Object, Object, Object>
          {
      
              private ProgressDialog progressDialog;
      
      
              @Override
              protected Object doInBackground(Object... params)
              {
      
                        try {
      
                            JSONObject subscriptionResponse = CommonJsonParser.responseForSignin(uname, pwd).getJSONObject("response");
      
                              if (!(subscriptionResponse.equals(null))||!(subscriptionResponse.equals("")))  {                    
      
      
                              }
      
      
                          }
      
      
      
                        catch (NullPointerException e) {
                              // TODO Auto-generated catch block
      
      
                          }
      
      
                        catch (JSONException e) {
                              // TODO Auto-generated catch block
                          }
      
      
                        catch (Exception e) {
                              // TODO Auto-generated catch block
                          }
      
                  return null;
      
              }
      
      
              @Override
              protected void onPostExecute(Object result) 
              {       
                  if(progressDialog!=null){
                  progressDialog.dismiss();
                  }       
      
                  super.onPostExecute(result);
              }
      
              @Override
              protected void onPreExecute() {
      
                  progressDialog = ProgressDialog.show(SignInActivity.this, "", "Please wait");
                  super.onPreExecute();
              }
      
          }
      

      使用AsyncTask。任何服务器请求或耗时较长的都应该写在后台任务中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        相关资源
        最近更新 更多