0

MySQL データベースから製品の詳細を取得しようとしていますが、コードをコンパイルすると、クラス GetProductDetails を AsyncTask として使用して execute を呼び出しても、NetworkOnMainThreadException エラーが発生します。チュートリアルに従って実行していたので、エラーが表示されないため、なぜこれが発生するのかよくわかりません。

これは私が使用しているコードです:

public class ListClubs extends Activity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clubs);  
new GetProductDetails().execute(); 

(...some code...)    
}

class GetProductDetails extends AsyncTask<String, String, String> {
      @Override
      protected void onPreExecute() {
          super.onPreExecute();
          pDialog = new ProgressDialog(ListClubs.this);
          pDialog.setMessage("Loading product details. Please wait...");
          pDialog.setIndeterminate(false);
          pDialog.setCancelable(true);
          pDialog.show();
      }
    /**
     * Getting product details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("pid", Integer.toString(1))); 

                    // getting product details by making HTTP request
                    // Note that product details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(url_product_detials, "GET", params);

                    // check your log for json response
                    Log.d("Single Product Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received product details
                        JSONArray productObj = json.getJSONArray(TAG_PRODUCT); // JSON Array

                        // get first product object from JSON Array
                        JSONObject product = productObj.getJSONObject(0);

                    }else{
                        // product with pid not found
                    } 
                } catch (JSONException e) {
                    e.printStackTrace();
                } 
            }
        });

        return null;
    }

    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }

 }

そして、これはログです:

FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.goout.JSONParser.makeHttpRequest(JSONParser.java:62)
at com.goout.ListClubs$GetProductDetails$1.run(ListClubs.java:464)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5227)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)

ありがとう!

4

3 に答える 3

1

このものを取り出して、doInbackground()何が起こるか見てみましょう

 runOnUiThread(new Runnable() {
        public void run() {

のポイントは、AsyncTaskネットワーク関連の作業や面倒な作業を実行してから、必要に応じdoInBackground()て他の方法を使用して更新することUIです。doInbackground()そのため、バックグラウンド code( ) をUI Threadwith で実行するように指示する目的とは逆のことをしたくありませんrunOnUiThread()

また、AsyncTask に関する本当に良い情報はこちら

于 2013-08-22T20:27:21.997 に答える
0

すべてのコードを AsyncTask から再びメイン UI に一度にマーシャリングしています。そのため、現在 AsyncTask が存在しないかのように、すべてが UI スレッドから実行されています。

ネットワーク コードを抽出して doInBackground メソッドで実行し、そこから (アプリケーションにとって) 意味のある型を返します。次に、doInBackground の結果で UI を更新するコードで onPostExecute メソッドをオーバーライドします。onPostExceute は常に Ui スレッドから実行されます。正しく使用すれば、自分でスレッドを管理する必要はありません。

詳細: http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-08-22T20:31:05.457 に答える
0

メソッドを追加するrunOnUiThreaddoInBackground、バックグラウンド スレッドがランナブルをメイン スレッドのキューに入れるため、そのランナブル内のすべて (ネットワーク タスクを含む) がメイン スレッドで実行されます。Android (Honeycomb+) では、これにより例外がスローされます。

s や特定のネットワーク リクエストに問題がある場合は、 droidQueryAndroid VolleyAsyncTaskなどの単純化に役立つライブラリを調べることを検討してください。

于 2013-08-22T20:43:50.097 に答える