문제

I used the parser given below with an example Android 2.2. My example is working and i have no problem. when tried to use the some example in a project using Android 4.3. but i have a problem with my parser line

HttpResponse httpResponse = httpClient.execute(httpPost);

I checked all the permission in my manifest, all of them are used.

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;

    }
}

the log is:

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)
도움이 되었습니까?

해결책 3

you are doing network work in main thread that why this error accours. for developing process you use this but not to live apps.

put this code in your Activity in oncreate method after setcontentView(layout)

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

다른 팁

don't use network activities in main thread.This exception only thrown for applications targeting the Honeycomb SDK or higher. perform all the network related task in separate thread . your problem will get solved.

Caused by: android.os.NetworkOnMainThreadException

You are running network realted operation on the ui thread.

HttpResponse httpResponse = httpClient.execute(httpPost);

The above statement must be in a thread or asynctask doInbackground.

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

Invoke asynctask on the ui thread new TheTask().execute()

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

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

        }
    }
Caused by: android.os.NetworkOnMainThreadException

You cannot use HttpResponse on main thread. You must use an AsyncTask get Json from Web.

Read this;

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

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

try this

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

    }

use AsyncTask.any server request or which takes long time should be written in background task

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top