-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

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

发生 NetworkOnMainThread 是因为您可能会在主 UI 线程上执行与网络相关的操作。您必须在后台线程中进行网络相关操作并在 ui 线程上更新 ui。

您可以使用 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.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

您可以考虑替代 asynctask robospicehttps://github.com/octo-online/robospice

于 2013-03-27T11:56:24.007 回答
1

看看 AsyncTask() 或者更好的是 AsyncTaskLoader()。您的问题中有很好的 Java 代码,但 Android 有点不同。

于 2013-03-27T11:16:55.930 回答