2015-06-10 60 views
0

閱讀內容時,所以我有一個類有以下故障:嘗試從URL

class NetworkRequest extends AsyncTask<String, StringBuilder, String> { 

    @Override 
    public String doInBackground(String... urls) { 

     try 
     { 
      URL url = new URL(urls[0]); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      InputStream inputStream = url.openStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 
      StringBuilder stringBuilder = new StringBuilder(); 
      int cp; 
      while ((cp = bufferedReader.read()) != -1) 
      { 
       stringBuilder.append((char) cp); 
      } 

      return stringBuilder.toString(); 
     } 
     catch(Exception ex) 
     { 
      return null; 
     } 
    } 

    public void onPostExecute(String string) 
    { 

    } 
} 

而且它在這裏被稱爲:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mediated); 
    TextView welcome_txt = (TextView) findViewById(R.id.test_view); 
    new NetworkRequest().execute("https://graph.facebook.com/me"); 
    NetworkRequest networkRequest = new NetworkRequest(); 
    String string = networkRequest.doInBackground(); 
    test_view.setText(string); 
} 

當這樣執行我與「無回「這說明它正在落在doInBackground方法的捕獲聲明中,我得到一個例外:

android.os.NetworkOnMainThreadException

有沒有人明白我在做什麼錯了?

+1

您直接在主線程上調用doInBackground方法。通常這種方法是通過執行執行來執行的,您已經在執行這個方法... –

+0

NetworkRequest networkRequest = new NetworkRequest(); String string = networkRequest.doInBackground(); 返回字符串;刪除這三條線。並且在你的textview中設置doInBackgroud的結果​​來實現一個體面的onPostExecute。 – greenapps

+0

AsyncTask 將其更改爲AsyncTask greenapps

回答

0

異常的直接原因是你不應該在你的主線程上運行網絡,而應該在後臺線程中運行它,並且只從它更新你的UI。要做到這一點

的一種方法是的AsyncTask(如你正在嘗試),另一種方法是使用一個庫如Volleyretrofit內搭背景線程對你的照顧。

+0

但是,如何從URL中返回字符串以呈現給UI? – Gusinator

+0

[This SO Answer](http://stackoverflow.com/questions/28172496/android-volley-how-to-isolate-requests-in-another-class/30604191#30604191)可以幫助你理解,我真的建議通過我在答案中發佈的鏈接,也介紹@greenapps提到的內容。 – TommySM

0

您不應該直接調用AsyncTask的doInBackground方法,而應該調用AsyncTask對象的execute方法,這會在後臺線程中執行網絡請求。 developer.android.com/reference/android/os/AsyncTask.html