-3

從服務器下載圖像並在Android中使用AsyncTask在ListView中顯示時,我遇到了一些問題。使用AsyncTask從顯示在ListView中的服務器下載圖像時出現錯誤(android.os.NetworkOnMainThreadException)

它向我顯示下載圖像在主(UI)線程中的錯誤但我正在使用AsyncTask來達到此目的。

這是我的MainActivity.java代碼。

public class MainActivity extends AppCompatActivity { 

    private String[] imageURLArray = new String[]{ 
      "http://farm8.staticflickr.com/7315/9046944633_881f24c4fa_s.jpg", 
      "http://farm4.staticflickr.com/3777/9049174610_bf51be8a07_s.jpg", 
      "http://farm8.staticflickr.com/7324/9046946887_d96a28376c_s.jpg", 
      "http://farm3.staticflickr.com/2828/9046946983_923887b17d_s.jpg", 
      "http://farm4.staticflickr.com/3810/9046947167_3a51fffa0b_s.jpg", 
      "http://farm4.staticflickr.com/3773/9049175264_b0ea30fa75_s.jpg", 
      "http://farm4.staticflickr.com/3781/9046945893_f27db35c7e_s.jpg", 
      "http://farm6.staticflickr.com/5344/9049177018_4621cb63db_s.jpg", 
      "http://farm8.staticflickr.com/7307/9046947621_67e0394f7b_s.jpg", 
      "http://farm6.staticflickr.com/5457/9046948185_3be564ac10_s.jpg", 
      "http://farm4.staticflickr.com/3752/9046946459_a41fbfe614_s.jpg", 
      "http://farm8.staticflickr.com/7403/9046946715_85f13b91e5_s.jpg", 
      "http://farm8.staticflickr.com/7315/9046944633_881f24c4fa_s.jpg", 
      "http://farm4.staticflickr.com/3777/9049174610_bf51be8a07_s.jpg", 
      "http://farm8.staticflickr.com/7324/9046946887_d96a28376c_s.jpg", 
      "http://farm3.staticflickr.com/2828/9046946983_923887b17d_s.jpg", 
      "http://farm4.staticflickr.com/3810/9046947167_3a51fffa0b_s.jpg", 
      "http://farm4.staticflickr.com/3773/9049175264_b0ea30fa75_s.jpg", 
      "http://farm4.staticflickr.com/3781/9046945893_f27db35c7e_s.jpg", 
      "http://farm6.staticflickr.com/5344/9049177018_4621cb63db_s.jpg", 
      "http://farm8.staticflickr.com/7307/9046947621_67e0394f7b_s.jpg", 
      "http://farm6.staticflickr.com/5457/9046948185_3be564ac10_s.jpg", 
      "http://farm4.staticflickr.com/3752/9046946459_a41fbfe614_s.jpg", 
      "http://farm8.staticflickr.com/7403/9046946715_85f13b91e5_s.jpg"}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ListView listView = (ListView)this.findViewById(R.id.listView); 
     ImageAdapter imageAdapter = new ImageAdapter(this, R.layout.imageitem, imageURLArray); 
     listView.setAdapter(imageAdapter); 
    } 
} 

這是我的ImageAdapter.java代碼。

public class ImageAdapter extends ArrayAdapter<String> { 
    private String[] imageURLArray; 
    private LayoutInflater inflater; 

    public ImageAdapter(Context context, int textViewResourceId, 
         String[] imageArray) { 
     super(context, textViewResourceId, imageArray); 
     // TODO Auto-generated constructor stub 

     inflater = ((Activity) context).getLayoutInflater(); 
     imageURLArray = imageArray; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.imageitem, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.imageView = (ImageView) convertView.findViewById(R.id.testImage); 
      convertView.setTag(viewHolder); 
     } 

     viewHolder = (ViewHolder) convertView.getTag(); 
     Bitmap imageBitmap = null; 
     try { 
      URL imageURL = new URL(imageURLArray[position]); 
      imageBitmap = BitmapFactory.decodeStream(imageURL.openStream()); 
      viewHolder.imageView.setImageBitmap(imageBitmap); 
     } catch (IOException e) { 
      // TODO: handle exception 
      Log.e("error", "Downloading Image Failed"); 
      viewHolder.imageView.setImageResource(R.mipmap.ic_launcher); 
     } 

     return convertView; 
    } 

    private static class ViewHolder { 
     Bitmap bitmap; 
     String imageURL; 
     ImageView imageView; 
    } 

    private class DownloadAsyncTask extends AsyncTask<ViewHolder, Void, ViewHolder> { 
     @Override 
     protected ViewHolder doInBackground(ViewHolder... params) { 
      // TODO Auto-generated method stub 
      //load image directly 
      ViewHolder viewHolder = params[0]; 
      try { 
       URL imageURL = new URL(viewHolder.imageURL); 
       viewHolder.bitmap = BitmapFactory.decodeStream(imageURL.openStream()); 
      } catch (IOException e) { 
       // TODO: handle exception 
       Log.e("error", "Downloading Image Failed"); 
       viewHolder.bitmap = null; 
      } 

      return viewHolder; 
     } 

     @Override 
     protected void onPostExecute(ViewHolder result) { 
      if (result.bitmap == null) { 
       result.imageView.setImageResource(R.mipmap.ic_launcher); 
      } else { 
       result.imageView.setImageBitmap(result.bitmap); 
      } 
     } 
    } 
} 

這裏是有完整項目的鏈接。

http://www.mediafire.com/download/70pxv6ib584x9j7/DownloadImagesInListView.rar

這裏是表示錯誤堆棧。

09-29 18:33:37.859 5550-5550/com.example.android.downloadimagesinlistview E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.android.downloadimagesinlistview, PID: 5550 
    android.os.NetworkOnMainThreadException 
      at 

    android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1161) 
       at java.net.InetAddress.lookupHostByName(InetAddress.java:418) 
       at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
       at java.net.InetAddress.getAllByName(InetAddress.java:215) 
       at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 
       at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 
       at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 
       at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272) 
       at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 
       at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 
       at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332) 
       at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199) 
       at java.net.URL.openStream(URL.java:470) 
       at com.example.android.downloadimagesinlistview.ImageAdapter.getView(ImageAdapter.java:48) 
       at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
       at android.widget.ListView.makeAndAddView(ListView.java:1864) 
       at android.widget.ListView.fillDown(ListView.java:698) 
       at android.widget.ListView.fillFromTop(ListView.java:759) 
       at android.widget.ListView.layoutChildren(ListView.java:1673) 
       at android.widget.AbsListView.onLayout(AbsListView.java:2151) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
       at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
       at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
       at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
       at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
       at android.view.View.layout(View.java:15689) 
       at android.view.ViewGroup.layout(ViewGroup.java:5040) 
       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2116) 
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1873) 
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084) 
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990) 
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
       at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
       at android.view.Choreographer.doFrame(Choreographer.java:550) 
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
       at android.os.Handler.handleCallback(Handler.java:739) 
       at android.os.Handler.dispatchMessage(Handler.java:95) 
       at android.os.Looper.loop(Looper.java:135) 
       at android.app.ActivityThread.main(ActivityThread.java:5343) 
       at java.lang.reflect.Method.invoke(
+4

的地方你希望我們下載項目?請發佈[MCVE](http://stackoverflow.com/help/mcve) –

+1

感嘆。只需通過您的代碼與異步代碼。人們將被迫下載黑客.rars – poss

+0

在'getView()'方法中,你的'ImageAdapter'(大概是某種形式的'ListAdapter')將一個URL傳遞給正在嘗試的東西(可能是'ImageView')下載無論如何。 – CommonsWare

回答

2

當您在主線程上執行網絡相關操作時,會發生此異常。要下載圖像,您必須在AsyncTask中執行操作或使用picasso庫。

使用畢加索使用本

Picasso.with(MainActivity.this).load(imageURLArray[position]).error(R.mipmap.ic_launcher).into(viewHolder.imageView); 

Bitmap imageBitmap = null; 
try { 
    URL imageURL = new URL(imageURLArray[position]); 
    imageBitmap = BitmapFactory.decodeStream(imageURL.openStream()); 
    viewHolder.imageView.setImageBitmap(imageBitmap); 
} catch (IOException e) { 
    // TODO: handle exception 
    Log.e("error", "Downloading Image Failed"); 
    viewHolder.imageView.setImageResource(R.mipmap.ic_launcher); 
} 
相關問題