2017-10-25 4 views
0

독일에서 온 좋은 아침!json 파일을 읽을 때 NetworkOnMainThreadException이 발생했습니다.

웹 서버에서 json 파일을 조금 읽으려고합니다. 앱을 시작하면 오류 메시지 (android.os.NetworkOnMainThreadException)가 나타납니다. {"first":"one","second":"two"} 웹 서버가 작동 :

대상은 그 로그 캣 내 JSON 컨텐츠를 보여주고있다,해야한다. 내가 127.0.0.1/index.php에 접속하면, 브라우저는 나에게 위쪽 라인을 보여준다.

이 내 홈페이지입니다 : 오류 로그에게 있습니다

package com.example.u0017007.jsonclient; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class MainActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet("http://127.0.0.1:80/index.php"); 
     StringBuilder stringBuilder = new StringBuilder(); 

     try { 
      HttpResponse response = httpClient.execute(httpGet); 
      int statusCode = response.getStatusLine().getStatusCode(); 
      if (statusCode == 200) { 
       BufferedReader reader = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent())); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
       } 

       Log.i(this.getClass().getSimpleName(), stringBuilder.toString()); 
      } else { 
       Log.e(this.getClass().getSimpleName(), "Fehler"); 
      } 

     } catch (ClientProtocolException e) { 
      Log.e(this.getClass().getSimpleName(), e.getMessage()); 

     } catch (IOException e) { 
      Log.e(this.getClass().getSimpleName(), e.getMessage()); 
     } 
    } 
} 

찾아서 그들의 사용을 만들지 만, 당신의 요점을 줄 수있는 질문이 관련되어
FATAL EXCEPTION: main 
Process: com.example.u0017007.jsonclient, PID: 16115 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.u0017007.jsonclient/com.example.u0017007.jsonclient.MainActivity}: android.os.NetworkOnMainThreadException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
    Caused by: android.os.NetworkOnMainThreadException 
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:333) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) 
    at java.net.Socket.connect(Socket.java:586) 
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:124) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:149) 
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169) 
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470) 
    at com.example.u0017007.jsonclient.MainActivity.onCreate(MainActivity.java:29) 
    at android.app.Activity.performCreate(Activity.java:6662) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6077)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756 

답변

0

해결 방법은 다음과 같습니다.

  • 네트워크 관련 항목을 쓰지 않아도됩니다. d는 기본 UI 스레드에서 호출하지만 AsyncTask를 사용하여 원하는대로 수행 할 수 있습니다.
  • 다음 가져 오기를 추가하여 주 코드에 다음 코드를 추가 할 수 있습니다.

수입 :

import android.os.StrictMode; 

코드 :

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