【问题标题】:NetworkOnMainThread ErrorNetworkOnMainThread 错误
【发布时间】:2013-03-17 10:52:15
【问题描述】:

大家好,我正在尝试从我的 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();

【问题讨论】:

标签: android image


【解决方案1】:

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

NetworkOnMainThread 发生是因为您可能会在主 UI 线程上执行与 netowrk 相关的操作。您必须在后台线程中进行网络相关操作并在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 robospice 的替代方案https://github.com/octo-online/robospice

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2012-04-02
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2012-04-06
      • 2016-08-07
      相关资源
      最近更新 更多