0

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)
4

5 に答える 5

2
Caused by: android.os.NetworkOnMainThreadException

UIスレッドでネットワーク関連操作を実行しています。

HttpResponse httpResponse = httpClient.execute(httpPost);

上記のステートメントは athreadまたは asynctaskにある必要がありますdoInbackground

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

UI スレッドで asynctask を呼び出すnew TheTask().execute()

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

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

        }
    }
于 2013-11-14T10:14:58.683 に答える
1

メインスレッドでネットワーク作業を行っているため、このエラーが発生します。プロセスの開発にはこれを使用しますが、アプリのライブには使用しません。

setcontentView(layout) の後に oncreate メソッドの Activity にこのコードを挿入します。

if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
于 2013-11-14T10:35:04.530 に答える
1
Caused by: android.os.NetworkOnMainThreadException

HttpResponseメインスレッドでは使用できません。AsyncTaskget Json from Web を使用する必要があります。

これを読む;

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

于 2013-11-14T10:15:31.297 に答える
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;
    }

これを試して

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.any サーバー リクエストを使用するか、時間がかかる場合はバックグラウンド タスクに書き込む必要があります

于 2013-11-14T10:20:47.730 に答える