0

我想使用以下代码读取 URL 的内容:

        myUrl=new URL(url);
        stream=myUrl.openStream();

但是第二行代码触发了“android.os.NetworkOnMainThreadException”,没有任何其他解释。

我在 Androïd 4 下工作,我可以添加此代码用于与 Androïd 2.3.3 一起工作。

任何的想法?

提前感谢您花时间帮助我。

4

3 回答 3

1

所以问题是应用程序试图在主线程上执行网络操作,这是不允许的。

为了您的目标,我建议AsyncTask您在后台使用并完成您的工作Thread

这是我的小应用程序的示例:

protected InputStream doInBackground(String... params) {

            int contentLength = 0;
            int buffLength = 0;
            int progress = 0;
            InputStream inputStream = null;
            try {

                URL url = new URL(params[0]);
                HttpURLConnection urlConntection = (HttpURLConnection) url.openConnection();
                urlConntection.setRequestMethod("GET");
                urlConntection.setAllowUserInteraction(false);
                urlConntection.setInstanceFollowRedirects(true);
                urlConntection.connect();
                if (urlConntection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    contentLength = urlConntection.getContentLength();
                    progressDialog.setMax(contentLength);
                    inputStream = urlConntection.getInputStream();

                    while ((buffLength = inputStream.read(MAX_BUFFER)) != -1) {
                        try {
                            Thread.sleep(1);
                            progress += buffLength;
                            DataTransmitted data = new DataTransmitted(progress, contentLength);
                            publishProgress(data);
                        }
                        catch (InterruptedException ex) {
                            Log.e(this.getClass().getName(), ex.getMessage());
                        }
                    }

                }
                else {
                    throw new IOException("No response.");
                }

            }
            catch (MalformedURLException ex) {
                Log.e(this.getClass().getName(), ex.getMessage());
            }
            catch (IOException ex) {
                errorDialog.show();
            }
            return inputStream;
        }

或者这里是类似的主题:

于 2012-09-29T13:42:15.193 回答
1

来自 Android 开发者的网站:

当应用程序尝试在其主线程上执行网络操作时,会引发 NetworkOnMainThreadException。

您需要将代码放在单独的线程或 AsyncTask 中。

Android 3.0 及以上版本对 UI 线程的滥用更加严格阅读本文了解更多详情

于 2012-09-29T13:46:19.277 回答
1

您现在需要使用 AsyncTask,这是一个简单的示例,希望对您有所帮助:

public class SimpleWebGrab extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    grabURL("http://android.com");
}

public void grabURL(String url) {
    new GrabURL().execute(url);
}

private class GrabURL extends AsyncTask<String, Void, Void> {
    private final HttpClient Client = new DefaultHttpClient();
    private String Content;
    private String Error = null;
    private ProgressDialog Dialog = new ProgressDialog(SimpleWebGrab.this);

    protected void onPreExecute() {
        Dialog.setMessage("Downloading source..");
        Dialog.show();
    }

    protected Void doInBackground(String... urls) {
        try {
            HttpGet httpget = new HttpGet(urls[0]);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            Content = Client.execute(httpget, responseHandler);
        } catch (ClientProtocolException e) {
            Error = e.getMessage();
            cancel(true);
        } catch (IOException e) {
            Error = e.getMessage();
            cancel(true);
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
        Dialog.dismiss();
        if (Error != null) {
            Toast.makeText(SimpleWebGrab.this, Error, Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(SimpleWebGrab.this, "Source: " + Content, Toast.LENGTH_LONG).show();
        }
    }

}
}

并且请:称它为 Android,而不是 Androïd,这听起来很法国。

于 2012-09-29T14:06:24.983 回答