2017-05-21 14 views
0

私は実際にはHttpUrlConnectionを使用してアプリケーションを使用していますが、インターネット上で最も単純なコードを試しましたが、logcatにFatalShutDownが残っています。ここでhttpurlconnectionのAndroidでFatalShutdown

はコードです:

try { 
    URL url = new URL("http://www.android.com/"); 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
    BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder total = new StringBuilder(); 
    String line; 
    while ((line = r.readLine()) != null) { 
      total.append(line).append('\n'); 
    } 
    response_textview.setText(total.toString()); 
    urlConnection.disconnect(); 
} 
catch (MalformedURLException e){ 
     response_textview.setText(e.getMessage()); 
} 
catch (IOException e){ 
     response_textview.setText(e.getMessage()); 
} 

そして私はlogcatでこれを持って:あなたは新しいスレッドでリクエストを行う必要があり

Logcat error

おかげ

+2

可能な複製を実行します。 os.NetworkOnMainThreadException?](http://stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception) –

+0

この「最も単純なコード」は、純粋なJav Androidアプリとしてではなく、 Androidネットワーキングのドキュメント –

答えて

1

を。おそらく、あなたのコード(それはtry catchのみです)がメインスレッド上で実行されています。この操作は拒否されます。例:新しいスレッドでリクエストを行うためのThread.class。

+0

スレッド内のテキストビューの値はどのように設定できますか? response_textview.setText(e.getMessage());バックグラウンドでUIを更新することはできません。 – Pehlaj

+0

これは単なる例ですが、runOnUIThreadを使用することはできます。 WeakReferenceでTextViewをラップすることなく、非同期タスクにテキストビューを渡すのとまったく同じです。 RxJavaを使用するのが理想的です。 –

+0

非同期タスクにテキストビューを渡す必要はありません。非同期タスクオブジェクトは同じクラスに作成され、テキストビューに直接アクセスできます。 – Pehlaj

1

メインスレッドでネットワーク操作を実行しないでください。 AsyncTaskを使用します。

1. AsyncTaskオブジェクトを作成し、後述するようにdoInBackgroundメソッドにコードを移動:

AsyncTask task = new AsyncTask<Void,String,String>(){ 

    @Override 
    protected String doInBackground(Void... params) { 
    // perform your network operation here and return response 

     try { 
      URL url = new URL("http://www.android.com/"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      BufferedReader r = new BufferedReader(new InputStreamReader(in)); 
      StringBuilder total = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       total.append(line).append('\n'); 
      } 

      urlConnection.disconnect(); 
     } 
     catch (MalformedURLException e){ 
      return e.getMessage(); 
     } 
     catch (IOException e){ 
      return e.getMessage(); 
     } 
     return total.toString(); 

    } 

    protected void onPostExecute(String response){ 
      // response returned by doInBackGround() will be received 
      // by onPostExecute(String response) 
       response_textview.setText(response); 
    } 

    }; 

2.アンドロイドを修正する【使い方のタスク

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
+0

ニースはメモリリークを取得しようとする –

+0

更新されたコードを参照してください:D – Pehlaj

関連する問題