自定义ListView适配器使用URL图像获取错误'StrictMode'

时间:2012-09-27 07:24:37

标签: android listview android-3.0-honeycomb android-strictmode

正在使用此自定义适配器显示youtube缩略图。

public class MyMedyaAdapter extends SimpleAdapter {
    Context context;
    int layout;
    List<? extends Map<String, ?>> data;
    String[] from;
    int[] to;

    String resimURL = "http://img.youtube.com/vi/{0}/0.jpg";

    public MyMedyaAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
        this.context = context;
        this.layout = resource;
        this.data = data;
        this.from = from;
        this.to = to;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(layout, parent, false);

        TextView metin = (TextView) rowView.findViewById(R.id.row_medya_text);

        String baslik = data.get(position).get(from[0]) + "";
        baslik = baslik.replace(".pdf", "");

        metin.setText(baslik);

        if (from.length > 1) {
            final ImageView resim = (ImageView) rowView.findViewById(R.id.row_medya_image);

            final int p2 = position;

            String resimID = data.get(p2).get(from[1])+"";

            String rowImage = resimURL.replace("{0}", resimID);
            try {
                Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(rowImage).getContent());
                resim.setImageBitmap(bitmap);

            } catch (Exception e) {
                // TODO: handle exception
            }
        }

        return rowView;
    }
}

使用此代码将适配器添加到listview;

public class VideoThered extends AsyncTask<Void, Void, MyMedyaAdapter> {

        @Override
        protected MyMedyaAdapter doInBackground(Void... params) {

            List<HashMap<String, String>> response = new ArrayList<HashMap<String, String>>();

            try {
                                //JSON request
                response = new JsonHelper().GetVideoEntitys();
            } catch (Exception e) {
                response = null;
            }

            if (response != null) {
                adapter = new MyMedyaAdapter(ctx, response, R.layout.row_medya, from, to);
            }
            else
            {
                adapter = null;
            }
            return adapter;
        }

        @Override
        protected void onPostExecute(MyMedyaAdapter result) {
            if (result != null) {
                                //StrictMode$AndroidBlockGuardPolicy.onNetwork() error with this line on honeycomb
                listVideolar.setAdapter(adapter);
            }
        }


    }

我收到/StrictMode$AndroidBlockGuardPolicy.onNetwork()错误。

如何设法从网上显示行图像而不会出现此错误?

我正在使用来自AsyncTask的listview主数据。  在此数据列表中,每个项目都有一个唯一的YouTube视频ID。有了这个id我正在从网上获取视频缩略图。但在我的自定义适配器上没有使用AsyncTask。我知道这就是问题所在。 但是,如何管理我的自定义适配器以使用AsyncTask?

1 个答案:

答案 0 :(得分:3)

您收到错误是因为您在UI线程中进行了网络访问。这被认为是不好的,因为网络访问需要很长时间,因此会阻止UI。

要解决此问题,您可以编写AsyncTask,在doInBackground方法中从网络中提取数据,然后在onPostExecute中使用位图/ drawable填充视图。 我认为Android文档有一个这种情况的例子,但我现在找不到它。

您还可以在我的Zwitscher应用中查看此source code snippetDownloadUserImageTask;从传递的User对象中检索url。然后将图片添加到

中的视图中
userPictureView.setImageBitmap(result);