0

次のコードで URL のコンテンツを読み取りたい:

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

しかし、コードの 2 行目は、他の説明なしに「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

You need to use AsyncTask now here's a quick example, i hope that will help you:

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

}
}

And please : call it Android, not Androïd it sounds french.

于 2012-09-29T14:06:24.983 に答える