0

したがって、次のコードを実行しようとすると、応答行を通過することはできません。私は何が間違っているのですか?マニフェストファイルでインターネットアクセスを許可しました。私とまったく同じコードを持つ約100の同様の例を見たので、私は何か巨大なものを見逃しているに違いありません。これらの数行を実行するためだけにサンプルプロジェクトを作成しましたが、それらはすべて同じように機能します。助けてください(最終的な目標はこれをhttpsでも機能させることですが、httpで機能させるための進歩は私にとって十分です)

try{

                        HttpClient myHttpClient = new DefaultHttpClient();
                        HttpPost myHttpPost = new HttpPost("http://www.siirretytnumerot.fi/index.html?clientLanguage=eng");
                       //^Ive tried about 10 different sites (http and https) none of them work

                        //NEVER GETS PAST THE LINE BELOW, JUMPS TO THE LAST CATCH BLOCK OF THE EXCEPTION
                        HttpResponse response = myHttpClient.execute(myHttpPost);
                        //NEVER GETS PAST THE ABOVE LINE...

                        String data = EntityUtils.toString(response.getEntity());
                        json= new JSONObject(data);
                    //parse the JSONObject
                       } catch (UnsupportedEncodingException e){e.printStackTrace();}
                         catch (ClientProtocolException e){e.printStackTrace();}
                         catch (IOException e){e.printStackTrace();}
                         catch (JSONException e) {e.printStackTrace();}
                         catch (NullPointerException e){ Log.e("My APP", "exception: " + e.getMessage());}
                         catch (Exception e ) {Log.e("My APP", "exception", e);} 


10-17 15:31:41.423: E/My APP(974): exception
10-17 15:31:41.423: E/My APP(974): android.os.NetworkOnMainThreadException
10-17 15:31:41.423: E/My APP(974):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
10-17 15:31:41.423: E/My APP(974):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
10-17 15:31:41.423: E/My APP(974):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
10-17 15:31:41.423: E/My APP(974):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-17 15:31:41.423: E/My APP(974):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-17 15:31:41.423: E/My APP(974):  at com.example.httpstuff.MainActivity$1.onClick(MainActivity.java:44)
10-17 15:31:41.423: E/My APP(974):  at android.view.View.performClick(View.java:3511)
10-17 15:31:41.423: E/My APP(974):  at android.view.View$PerformClick.run(View.java:14105)
10-17 15:31:41.423: E/My APP(974):  at android.os.Handler.handleCallback(Handler.java:605)
10-17 15:31:41.423: E/My APP(974):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-17 15:31:41.423: E/My APP(974):  at android.os.Looper.loop(Looper.java:137)
10-17 15:31:41.423: E/My APP(974):  at android.app.ActivityThread.main(ActivityThread.java:4424)
10-17 15:31:41.423: E/My APP(974):  at java.lang.reflect.Method.invokeNative(Native Method)
10-17 15:31:41.423: E/My APP(974):  at java.lang.reflect.Method.invoke(Method.java:511)
10-17 15:31:41.423: E/My APP(974):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-17 15:31:41.423: E/My APP(974):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-17 15:31:41.423: E/My APP(974):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

完璧です、それが私が探していたものです。NetworkOnMainThreadExceptionを検索すると、このページが表示されます。つまり、アプリのメインスレッドでHTTPリクエストを実行することはできませんが、Honeycombをターゲットにしている場合に限ります。

したがって、これを修正する最も簡単な方法は、別のAndroidバージョンをターゲットにすることです。たぶん2.3、またはジェリービーンズまで。これを解決する別の方法は、HTTPリクエストを実行するようにAsyncTaskを設定することです。

別のAndroidバージョンをターゲットにすることができる場合は、それを実行します。そうでない場合は、AsyncTaskをお手伝いします。ただし、メインスレッドでネットワークリクエストを実行しないことを強くお勧めします。

AsyncTasksに関しては、常にAndroidのドキュメントを参照するのが最適です。

基本的な考え方は、AsyncTaskクラスを拡張して、doInBackgroundメソッドを実装することです。次に、新しいクラスのインスタンスを作成し、execute()を呼び出します。ドキュメントのコードスニペットは次のとおりです。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
        int count = urls.length;
        long totalSize = 0;
        for (int i = 0; i < count; i++) {
            totalSize += Downloader.downloadFile(urls[i]);
            publishProgress((int) ((i / (float) count) * 100));
            // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        return totalSize;
    }

    protected void onProgressUpdate(Integer... progress) {
        setProgressPercent(progress[0]);
    }

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}

new DownloadFilesTask().execute(url1, url2, url3);
于 2012-10-17T15:55:39.853 に答える