2012-04-05 56 views
0

在我的應用程序中,我打開一個連接來加載數據。在手機設備(galaxy 2)和平板電腦p1000(os 7 2.2的老式7英寸平板電腦)中,我沒有任何問題,我可以獲取和解析數據。但是在另一個平板電腦(三星7「plus - Honeycomb)中,應用程序崩潰。 logcat的說:Android,如何從服務器加載圖像?

04-05 16:31:33.905: E/AndroidRuntime(4137): FATAL EXCEPTION: main 
04-05 16:31:33.905: E/AndroidRuntime(4137): android.os.NetworkOnMainThreadException 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at java.net.InetAddress.lookupHostByName(InetAddress.java:477) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at java.net.InetAddress.getAllByName(InetAddress.java:249) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at cam.astro.mania.adapters.NewsAdapter.fetchImages(NewsAdapter.java:105) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at cam.astro.mania.adapters.NewsAdapter.setData(NewsAdapter.java:45) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.astro.mania.activities.NewsList.displayData(NewsList.java:359) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.astro.mania.activities.NewsList.access$4(NewsList.java:358) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:199) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.astro.mania.activities.NewsList$MyAsyncTask.onPostExecute(NewsList.java:1) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.AsyncTask.finish(AsyncTask.java:590) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.AsyncTask.access$600(AsyncTask.java:149) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.os.Looper.loop(Looper.java:132) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at java.lang.reflect.Method.invoke(Method.java:491) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
04-05 16:31:33.905: E/AndroidRuntime(4137):  at dalvik.system.NativeStart.main(Native Method) 

我的代碼是:

/*------------------------------- 
    * Downloading images from server 
    * ------------------------------*/ 
    private Bitmap[] fetchImages(ArrayList<String> urlstr){ 
     InputStream is= null; 
     Bitmap bm = null; 
     Bitmap[] bmList = new Bitmap[urlstr.size()]; 

     try { 
      for(int i=0; i<urlstr.size(); i++){ 
       HttpGet httpRequest = new HttpGet(urlstr.get(i)); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 

       HttpEntity entity = response.getEntity(); 
       BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
       is = bufHttpEntity.getContent(); 
       bm = BitmapFactory.decodeStream(is); 
       bmList[i] = bm; 
      } 
     }catch (MalformedURLException e){ 
      Log.d("RemoteImageHandler", "fetchImage passed invalid URL: " + urlstr); 
     }catch (IOException e){ 
      Log.d("RemoteImageHandler", "fetchImage IO exception: " + e); 
     }finally{ 
      if(is!=null)try{ 
       is.close(); 
      }catch(IOException e){} 
     } 

     return bmList; 
    } 

logcat的點HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 我不明白什麼是錯誤的意思。問題是什麼?

感謝您的幫助。

回答

0

爲您開始一個新的線程下載並在那裏執行。通過消息通知您的主線程Handler或只是等待線程完成使用加入()

1

This error表示您不允許在主線程中執行聯網操作。

您需要在另一個線程中執行並異步獲取結果。

希望它有幫助。

Jokahero

0

你可以通過此代碼將圖像加載到imageview。

ImageView ImageView =(ImageView)dialog.findViewById(R.id.ImageView01); 
    InputStream is = null; 
    try { 
     is = (InputStream) new URL(ClueImgURL).getContent(); 
    } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    Drawable d = Drawable.createFromStream(is, "src name"); 
    ImageView .setBackgroundDrawable(d); 

這裏ClueImgURL是圖像的URL。