2016-03-19 7 views
0

ich diesen Code bin mit Website-Daten innerhalb von Android activity.It abzurufen wirft android.os.networkonmainthreadexceptionNetworkOnMainThreadException android Aktivität

try 
     { 
      URL url = new URL("https://enigmatic-woodland-35608.herokuapp.com/pager.json"); 
      URLConnection tc = url.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        tc.getInputStream())); 
      String line, newl = " "; 
      while ((line = in.readLine()) != null) { 
       newl += line.trim(); 
      } 
      System.out.println("newl" + newl.trim()); 
     } catch (Exception e) { 
      Log.e("exception", e.toString()); 
     } 

Bitte geben Sie mir eine mögliche Lösung ..

+0

Android donot erlauben laufen lang laufenden Betrieb auf UIThread. Sie müssen Worker-Thread erstellen, indem Sie AsyncTask oder Thread verwenden – mubeen

+2

Sie sollten AsyncTask verwenden, um eine lange Operation-Task, die auf Haupt-UIThread unabhängig ist, auszuführen. AsyncTask ist eine sichere Möglichkeit, das zu tun – GiapLee

Antwort

3

Netzwerkoperationen/Anruf kann nicht im Hauptthread durchgeführt werden. Sie müssen es von einem anderen Thread, asynchrone Aufgabe oder einer Intent-Dienst auszuführen

Hinweis: Alle UI opration OnPostExecute getan werden shoud, OnPreExecute

Der Code unten kann Ihnen helfen, zu lösen.

Anruf AsyncTask wo Sie

new PagerAsyncTask().execute(); 

class PagerAsyncTask extends AsyncTask<String,Void,String>{ 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
      } 

     @Override 
     protected String doInBackground(String... params) { 
      StringBuilder sb=null; 
      BufferedReader reader=null; 
      String serverResponse=null; 
      try { 

       URL url = new URL(""https://enigmatic-woodland-35608.herokuapp.com/pager.json""); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       connection.setConnectTimeout(5000); 
       connection.setRequestMethod("GET"); 
       connection.connect(); 
       int statusCode = connection.getResponseCode(); 
       //Log.e("statusCode", "" + statusCode); 
       if (statusCode == 200) { 
        sb = new StringBuilder(); 
        reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
        } 
       } 

       connection.disconnect(); 
       if (sb!=null) 
        serverResponse=sb.toString(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if (reader != null) { 
        try { 
         reader.close(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      return serverResponse; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      //All your UI operation can be performed here 
      //Response string can be converted to JSONObject/JSONArray like 
      JSONObject response=new JSONObject(s); 
      System.out.println(s); 
     } 
    } 
+0

danke mann hat funktioniert !!!! –

+0

Willkommen .. Happy coding .. –

+0

Hallo Andan können Sie mir sagen, wie Werte für die Serverresponse als Jsonobject Schlüssel –

2

Netzbetrieb kann zu unvorhersehbaren Verzögerungen führen. Um zu verhindern, dass zu einer schlechten Benutzererfahrung führt, führen Sie die Netzwerkvorgänge immer in einem separaten Thread von der Benutzeroberfläche aus.

Bitte überprüfen Sie die doc.

+0

danke !! es hat funktioniert –

0

möchte ich bin mit einem NetworkOps util in meinen Projekten. Versuchen Sie es:

import android.content.Context; 
import android.net.Uri; 
import android.util.Log; 

import com.csehelper.variables.Constants; 
import com.csehelper.variables.Keys; 
import com.csehelper.variables.Url; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.ProtocolException; 
import java.net.SocketTimeoutException; 
import java.net.URL; 
import java.util.ArrayList; 

public class NetworkOps { 
    public final String EXCEPTION = "~Exception~"; 
    /**************************** 
    * Method to Grab Source 
    ****************************/ 
    public static String GrabSource(String URL) { 
     return PostData(URL, null); 
    } 



    /** 
    * ***************************************** 
    * Method to Grab Source code from URL 
    * Posting Data 
    * ***************************************** 
    */ 
    private static String PostData(String url, Uri.Builder uribuilder) { 
     String Source; 
     HttpURLConnection.setFollowRedirects(false); 
     HttpURLConnection urlConnection = null; 
     try { 
      urlConnection = (HttpURLConnection) new URL(url).openConnection(); 
      urlConnection.setDoOutput(true); 
      urlConnection.setConnectTimeout(10000); 

      if(uribuilder != null) { 
       String query = uribuilder.build().getEncodedQuery(); 

       OutputStream os = urlConnection.getOutputStream(); 
       BufferedWriter writer = new BufferedWriter(
         new OutputStreamWriter(os, "UTF-8")); 
       writer.write(query); 
       writer.flush(); 
       writer.close(); 
       os.close(); 
      } 

      urlConnection.connect(); 

      if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 

       String line; 
       StringBuilder builder = new StringBuilder(); 
       InputStreamReader isr = new InputStreamReader(
         urlConnection.getInputStream()); 
       BufferedReader reader = new BufferedReader(isr); 
       while ((line = reader.readLine()) != null) { 
        builder.append(line); 
       } 
       Source = builder.toString(); 
      } else { 
       Source = EXCEPTION + "Server unreachable. Check network connection."; 
      } 
     } catch (SocketTimeoutException e) { 
      Source = EXCEPTION + "Connection timed out."; 
     } catch (java.net.UnknownHostException e) { 
      Source = EXCEPTION + Constants.EXCEPTION_NO_NET; 
     } catch (ArrayIndexOutOfBoundsException e) { 
      Source = EXCEPTION + "Server error"; 
     } catch (ProtocolException e) { 
      Source = EXCEPTION + "Protocol error"; 
     } catch (IOException e) { 
      Source = EXCEPTION + "Server unreachable. Check network connection."; 
     } catch (Exception e) { 
      Source = EXCEPTION + "Error:" + e.toString() + " - " 
        + e.getMessage(); 
      e.printStackTrace(); 

     } finally { 
      if (urlConnection != null) urlConnection.disconnect(); 
     } 
     return Source; 
    } 


} 

Rufen Sie diese statischen Funktionen von AsyncTask:

/********************************* 
* AsyncTask to GrabSource 
********************************/ 
class AsyncTask_GrabSource extends AsyncTask<Void, Void, Void> { 

    String Source = null; 
    String url = "https://enigmatic-woodland-35608.herokuapp.com/pager.json"; 
    @Override 
    protected void onPreExecute() { 
     //Runs on Main Thread. You can access your UI elements here. 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // Don't access any UI elements from this function 
     Source = NetworkOps.GrabSource(this.url); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (Source != null) { 
      if (!Source.contains(EXCEPTION)) { 
       //Show Error Message or do whatever you want 
      } else { 
       //Do Whatever with your Grabbed Sourcecode. 
       // This function runs on UI Thread, so you can update UI elements here 
      } 

    } 
} 

Sie auch Daten mit der Funktion Postdata veröffentlichen können. Fügen Sie in der Methode doInBackground Folgendes hinzu:

Uri.Builder builder = new Uri.Builder() 
        .appendQueryParameter("key", "value") 
        .appendQueryParameter("key2", "value2"); 

Source = NetworkOps.PostData(getApplicationContext(), url, builder);