2012-07-03 3 views
1

어쨌든 나는 그것을 얻지 못하는 것 같습니다. 8-} 데이터베이스에서 JSON 데이터를 요청하는 액티비티가 있는데 반환 결과에는 이미지 URL이 포함됩니다. 내 응용 프로그램은 Android v2.x에서 제대로 작동하지만, 우연히 발견해야하는 것처럼 Android 4에로드되지 않은 이미지를 포함하여 이상한 동작이 있습니다 (호환성이라고하지는 않습니까?) 이제는 그 수정은 안드로이드 2.x 시스템에서 다시 기능을 엉망으로 만들지 않기를 바란다.NetworkOnMainThreadException load image how

기본적으로, 활동이 웹에있는 모든 수많은 예에 설명 된대로 (내가 필수적인 부분에 아래 코드를 트림 등 확인 대부분의 오류를 제거) 작동 : 이제

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

targetSDKVersion이 너무 높다고 가정합니다. Here은 targetSDKVersion에서 어떤 호환성 동작이 비활성화되었는지에 대한 문서입니다. 실제로 해당 목록에서 NetworkOnMainThreadException이 누락되었습니다. here은 "Honeycomb SDK 이상을 대상으로하는 응용 프로그램에서만 발생합니다. 이전 SDK 버전을 대상으로하는 응용 프로그램은 기본 이벤트 루프 스레드에서 네트워킹을 수행 할 수 있지만 크게 권장하지 않습니다."

targetSDKVersion을 Honeycomb 이하로 낮추면 주 스레드에서 네트워킹을 수행 할 수 있습니다. targetSDKVersion을 특정 값으로 설정하는 것은 다음과 같습니다. "해당 수준에서 내 응용 프로그램을 테스트했습니다."

  1. onPostExceute 항상 주 스레드에서 실행됩니다. runOnUiThread()를 사용할 필요가 없습니다.
  2. 주 스레드에서 실행하지 않으려면 LoadImageFromWebOperations()를 doInBackground()에서 호출해야합니다. 이로 인해 예외가 발생합니다.
  3. onPostExecute는 doInBackground에서 반환하는 매개 변수를 가져옵니다. 따라서 onPostExcecute에서 매개 변수를 사용하지 않고 항상 doInBackground에서 null을 반환하면 Void를 결과 유형으로 사용할 수 있습니다 (String 대신)