连接到URL

时间:2012-09-29 13:41:00

标签: android url

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

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

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

我在Androïd4下工作,我可以添加用于Androïd2.3.3的代码。

有什么想法吗?

提前感谢你花时间去帮助我。

3 个答案:

答案 0 :(得分: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;
        }

或者这里是类似的主题:

答案 1 :(得分:1)

来自Android开发者的网站:

  
    

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

  

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

Android版本3.0及更高版本更严格关于滥用UI线程Read this article for more details

答案 2 :(得分: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,它听起来像法国人。