2012-07-03 25 views
1

不知何故,我似乎并没有得到它。 8-} 我有一个活动,我从数据库请求JSON数据,返回结果包含一个图片URL。我的应用在Android v2.x上运行良好,但由于偶然发现,在Android 4上出现了奇怪的行为 - 包括未加载的图像(这不是我称之为兼容性?!)现在我必须修复这个问题,希望修复不会再次破坏Android 2.x系统的功能!NetworkOnMainThreadException加载图片如何

基本上,活动作品在网络上的所有无数的例子说明(我删除了最错误检查等,以修剪下来的代码主要部分):

new GetProductDetails().execute(); 
(..) 


class GetProductDetails extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
      (..) 
    } 

    protected String doInBackground(String... args) { 

     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair("pid", pid)); 
     // getting product details by making HTTP request 
     JSONObject json = jsonParser.makeHttpRequest(
       getString(R.string.urlProductDetails), "GET", 
       params); 
     try { 
       JSONArray prodObj = json.getJSONArray(Consts.PRODS); 
       pinfo = prodObj.getJSONObject(0); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


    protected void onPostExecute(String file_url) { 
     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Storing each json item in variable 
       try { 

        String s = ""; 
        txtvname = (TextView) findViewById(R.id.txtpname); 
        txtshortinfo = (TextView) findViewById(R.id.txtshortinfo); 
(… populating activity window with json data …) 

      } 
     }); 


     // update image: 
     String imgURL; 
     try { 
      imgURL = pinfo.getString("pic_url"); 
      if (imgURL.length() > 1) { 
       imgURL = getString(R.string.urlPicsFull) + imgURL; 
       ImageView imgProd = (ImageView) findViewById(R.id.imgProduct); 
       Drawable drawable = LoadImageFromWebOperations(imgURL); 
       imgProd.setImageDrawable(drawable); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     pDialog.dismiss(); 
    } 

    private Drawable LoadImageFromWebOperations(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } catch (Exception e) { 
      System.out.println("Could not load " + url + ", Exc=" + e); 
      return null; 
     } 
    } 

现在,有一个加载图像时出现android.os.NetworkOnMainThreadException。

回答

0

我想你的targetSDK版本太高了。 Here是关于哪些targetSDKVersion禁用了哪些兼容性行为的一些文档。 NetworkOnMainThreadException实际上从该列表中缺失。它被记录为here,如下所示:“这仅仅针对面向Honeycomb SDK或更高版本的应用程序而引发,针对早期SDK版本的应用程序允许在其主要事件循环线程上进行联网,但非常不鼓励。

因此,如果您将targetSDKVersion降至Honeycomb以下的值,则可以在主线程上进行联网。将targetSDKVersion设置为某个值就像是在说:“我在那个级别上测试了我的应用程序。”

  1. onPostExceute总是在主线程上运行。不需要在那里使用runOnUiThread()。
  2. LoadImageFromWebOperations()需要在doInBackground()中调用,以便不在主线程上运行。这是造成异常的原因。
  3. onPostExecute获取doInBackground返回的参数。因此,如果您不使用onPostExcecute中的参数并在doInBackground中始终返回null,则可以使用Void作为结果类型(而不是字符串)