从URL中读取内容时尝试失败

时间:2015-06-10 20:44:45

标签: android android-asynctask

所以我有一个课程如下:

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);
}

当执行此操作时,我将返回&#34;没有&#34;这解释了它落在doInBackground方法的catch语句中,我得到了一个例外:

android.os.NetworkOnMainThreadException

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:0)

异常的直接原因是你不应该在主线程上运行网络,而是在后台线程中运行它,只从它更新你的UI。

一种方法是使用AsyncTask(正如您尝试的那样),另一种方法是使用Volleyretrofit等库来处理背景线程。

答案 1 :(得分:0)

您不应该直接调用AsyncTask的doInBackground方法,而应该在AsyncTask对象上调用execute方法,这将在后台线程中执行网络请求。 developer.android.com/reference/android/os/AsyncTask.html