-4

こんにちは皆さん、私のMSQLデータベースから製品情報を取得しようとしています。価格とタイトルは機能しますが、画像は機能しません。NetworkOnMainThreadエラーが発生し続けます。これは、コードがrunOnUiThreadにあり、メインスレッドにあるためです。しかし、runOnUIThreadを削除し、内部のコードが実行されない新しい実行可能ファイルのみを持っている場合は、考えられるすべての解決策を試しました。助けてください。どんな解決策もありがたいです。

// TODO Auto-generated method stub
Tread loadingThread = new Thread(){
    String result = "";
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try{
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity httpentity=response.getEntity();
            InputStream inputStream = httpentity.getContent();  

            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"),8);
            StringBuilder stringBuilder = new StringBuilder();
            String line = null;

            while ((line = reader.readLine())!=null){
                stringBuilder.append(line+"\n");
            }
            inputStream.close();        
            result=stringBuilder.toString();

            JSONArray Array = new JSONArray(result);
            JSONObject jsonObject=null;
            jsonObject = Array.getJSONObject(0);

            String productTitle = jsonObject.getString("title");
            String productPrice = jsonObject.getString("price");
            final String productImage = jsonObject.getString("image_url");

            productTextViewPrice.setText(productPrice);
            productTextViewTitle.setText(productTitle);

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    // TODO Auto-generated method stub
                    try {
                        InputStream is = (InputStream) new URL(productImage).getContent();
                        Log.i("log_URL","URL is " + productImage);
                        Drawable proImage = Drawable.createFromStream(is, "src name");
                        productImageFull.setImageDrawable(proImage);
                    } catch (Exception e) {
                        Log.i("log_Result","error getting image " + e.toString());
                    }
                }
            });

        } catch (Exception e){

        }
        super.run();
    }
};
loadingThread.start();
4

2 に答える 2

1

AsyncTask()、より良いのはAsyncTaskLoader()を見てください。あなたの質問にはすばらしいJavaコードがありますが、Androidは少し異なります。

于 2013-03-27T11:16:55.930 に答える
1

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

NetworkOnMainThreadが発生するのは、メインUIスレッドでnetowrk関連の操作を実行している可能性があるためです。バックグラウンドスレッドでネットワーク関連の操作を行い、UIスレッドでupdatauiを実行する必要があります。

asycntaskを使用できます。http://developer.android.com/reference/android/os/AsyncTask.html

class TheTask extends AsyncTask<Void,Void,Void>
{
      protected void onPreExecute()
      {           super.onPreExecute();
                //display progressdialog.
      } 

       protected void doInBackground(Void ...params)
      {  
            //http request. do not update ui here

            return null;
      } 

       protected void onPostExecute(Void result)
      {     
                super.onPostExecute(result);
                //dismiss progressdialog.
                //update ui
      } 

 }

ネットワーク操作が短期間である場合は、非同期タックを使用してください。

ドキュメントから直接

AsyncTasksは、理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合は、java.util.concurrentpacakgeによって提供されるさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutorおよびFutureTask。

asynctaskrobospiceの代替案を検討できます。https://github.com/octo-online/robospice

于 2013-03-27T11:56:24.007 に答える