0

Im кодирует небольшое приложение для Android, которое должно получать данные с jpm-сервера npm. Это исключает. Я расширил класс подключения с помощью AsyncTask и выполнил код в «doInBackground», но он по-прежнему вызывает исключение. Пожалуйста помогите.GET данные от NPM json-server throws NetworkOnMainThreadException

Вот код:

import android.os.AsyncTask; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class Network extends AsyncTask <String, Void, String> { 
    public String urlString = ("http://localhost:3000"); 

    @Override 
    protected String doInBackground(String... params) { 
     StringBuffer chaine = new StringBuffer(""); 
     try { 
      URL url = new URL(urlString); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestProperty("User-Agnet", ""); 
      connection.setRequestMethod("POST"); 
      connection.setDoInput(true); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream)); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       chaine.append(line); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedOperationException e) { 
      e.printStackTrace(); 

     } 
     return chaine.toString(); 
    } 
} 

LogCat говорит:

android.os.NetworkOnMainThreadException в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1147) в java.net.InetAddress.lookupHostByName (InetAddress.java:418) at java.net.InetAddress.getAllByNameImpl (InetAddress.java:252) at java.net.InetAddress.getAllByName (InetAddress.java:215) в com.android.okhttp.HostResolver $ 1.getAllByName (HostResolver.java:29) в com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress (RouteSelector.java:232) в com.android.okhttp.internal .http.RouteSelector.next (RouteSelector.java:124) at com.android.okhttp.internal.http.HttpEngine.connect (HttpEngine.java:361) at com.android.okhttp.internal.http.HttpEngine.sendRequest (HttpEngine.java:289) at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.java:373) at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect (HttpURLConnectionImpl.java:106) на smoca.ch.kreagen.Network.doInBackground (Network.java:25) на smoca.ch.kreagen. BackendMockup.getData (BackendMockup.java:11) на smoca.ch.kreagen.FillRealm.initRealm (FillRealm.java:43) на smoca.ch.kreagen.Fragments.HomeFragment.onCreateView (HomeFragment.java:42) at android.support.v4.app.Fragment.performCreateView (Fragment.java:1789) at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:955) at android.support.v4.app.FragmentManagerImpl. moveToState (FragmentManager.java:1138) на android.support.v4.app.BackStackRecord.run (BackStackRecord.java:740) на android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1501) на android.support.v4.app.FragmentManagerImpl $ 1.run (FragmentManager.java:458) на android.os.Handl er.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:145) на android.app.ActivityThread. main (ActivityThread.java:5832) по адресу java.lang.reflect.Method.invoke (собственный метод) по адресу java.lang.reflect.Method.invoke (Method.java:372) at com.android.internal.os .ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1399) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194)

Я знаю, что проблема в том, когда «connection.connect ();» получает вызов, потому что он должен находиться в главной теме. Но не следует. правильно?

Привет Джон

+0

Вам не нужно называть 'connection.connect()' удалить его. – Breavyn

+0

как вы используете класс 'Network'? – LordRaydenMK

+0

Пожалуйста, не вызывайте напрямую doInBackground – Blackbelt

ответ

1
public class Network extends AsyncTask <String, Void, String> { 
    public String urlString = ("http://localhost:3000"); 
    HttpURLConnection connection; 
    URL url; 
    StringBuffer chaine; 

    @Override 
    protected String doInBackground(String... params) { 

    Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       chaine = new StringBuffer(""); 
     try { 
      url = new URL(urlString); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestProperty("User-Agnet", ""); 
      connection.setRequestMethod("POST"); 
      connection.setDoInput(true); 
      connection.connect(); 

      InputStream inputStream = connection.getInputStream(); 

      BufferedReader rd = new BufferedReader(new  InputStreamReader(inputStream)); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       chaine.append(line); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedOperationException e) { 
      e.printStackTrace(); 

     } 
      } 
     }); 
     thread.start(); 

     return chaine.toString(); 
    } 
} 
+0

Я уже изменил свой метод .. Теперь используя Requestqueue (volley) .. thx –

Смежные вопросы