0

WebView にロードする前に、特定の URL の HTTP 応答を確認したいと考えています。http 応答が 200 の場合にのみ webview をロードしたいcode。これは、http エラーをインターセプトするための回避策です。私は以下を持っています:

HttpGet httpRequest = new HttpGet( "http://example.com");
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(httpRequest);
int code = response.getStatusLine().getStatusCode();

しかし、次のエラーが発生しました。

java.lang.RuntimeException: Unable to start activity ComponentInfo
android.os.NetworkOnMainThreadException

修正方法は?または、webview で http エラーをインターセプトする回避策はありますか? ありがとう

4

5 に答える 5

4

android.os.NetworkOnMainThreadExceptionメイン UI スレッドで長時間実行されるタスク/プロセスを直接作成しようとするたびに発生します。

この問題を解決するには、Web サービス呼び出しを 内に含めますAsyncTask。参考までに、開発者がスレッド管理について気にする必要がないことを意味する、 Painless Threadingとして知られる Android の AsyncTask 。そのため、AsyncTask を使用して Web API 呼び出しまたは実行時間の長いタスクを実装してください。Web には多くの例があります。

アップデート:

http応答コードが200の場合にのみwebviewをロードしたい.

=>要件に基づいて、doInBackground()メソッド内にコードを含め、ステータスコード値を返します。これは内部で確認できますonPostExecute()。ここで、ステータス コード値 200/201 を取得し、WebView をロードできます。

于 2013-05-21T12:11:34.400 に答える
3
class HTTPRequest extends AsyncTask<int, Void, void> {



    protected int doInBackground() {
        try {
            HttpGet httpRequest = new HttpGet( "http://example.com");
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httpRequest);
            int code = response.getStatusLine().getStatusCode();
            return code;
        } catch (Exception e) {
           e.printstacktrace();

        }
    }

    protected void onPostExecute(int code) {
        // TODO: check this.exception 
        // retrieve your 'code' here
    }
 }
于 2013-05-21T12:49:28.123 に答える
1

UIスレッドで重い計算、つまりネットワークへのアクセスを実行しているため、この例外が発生しています。

これを行うべきではありません。

むしろ、このコードをバックグラウンド Java スレッドに移動できます: 試してください:

private void doNetworkCompuation()
{
 new Thread(new Runnable() {

            @Override
            public void run() {

HttpGet httpRequest = new HttpGet( "http://example.com");

HttpClient httpclient = new DefaultHttpClient();

HttpResponse response = httpclient.execute(httpRequest);

int code = response.getStatusLine().getStatusCode();

}).start();
}
于 2013-05-21T12:17:47.650 に答える