2013-11-14 3 views
0

Я использовал синтаксический анализатор, приведенный ниже, с примером Android 2.2. Мой пример работает, и у меня нет проблем. когда пытался использовать какой-то пример в проекте с помощью Android 4.3. но у меня проблема с моей синтаксической линиейкак использовать Json parser android?

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) 
+0

имеют разрешение у использоваться сети в файле манифеста? – Ruban

+0

Возможный дубликат [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

ответ

1

Вы делаете сетевую работу в основной теме, почему эта ошибка встречается. для разработки процесса, который вы используете, но не для того, чтобы жить в приложениях.

поместить этот код в вашей деятельности в OnCreate метод после setcontentView (макет)

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

http://blog.vogella.com/2011/04/04/android-strictmode/. StrictMode следует использовать только во время разработки, а не в вашем реальном приложении. http://developer.android.com/reference/android/os/StrictMode.html. Так что мне интересно, как это решение op должно переместить код в поток – Raghunandan

+1

, это очень плохой ответ на этот вопрос. – cbrulak

2
Caused by: android.os.NetworkOnMainThreadException 

Вы работаете сеть realted операции на потоке пользовательского интерфейса.

HttpResponse httpResponse = httpClient.execute(httpPost); 

Данное заявление должно быть в thread или AsyncTask doInbackground.

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

Invoke AsyncTask на Ui нить new TheTask().execute()

class TheTask extends AsyncTask<Void ,Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
        JSONObject jobject =getJSONFromUrl(String url); 
      return null; 

     } 
    } 
+0

вы можете объяснить больше. В моем парсере, что такое параметры? – user2043602

+0

, который является var args google для того же самого. это doinbackground для асинтезы и переместить ваш связанный с сетью код в doinbackground. – Raghunandan

+0

@ user2043602, что заставило вас думать, что принимающий ответ - это решение, см. Здесь http://developer.android.com/reference/android/os/StrictMode.html – Raghunandan

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

попробовать запрос AsyncTask.any сервера этот

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

    } 

использовать или который занимает много времени, должно быть написано в фоновом

4

не используют сетевые действия в основном потоке. Это исключение только для приложений ориентируясь на SDK Honeycomb или выше. выполнить всю связанную с сетью задачу в отдельном потоке. ваша проблема будет решена.