有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何制作用于在安卓 gallery小部件中加载图像的背景线程

我想从URL中读取图像,并将其显示在安卓 gallery小部件中

所以我在onCreate()方法中编写了以下代码

        list = GuideDAO.getAllImages(businessId);


        Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setSpacing(2);

        // Set the adapter to our custom adapter (below)
        if(list.size() > 0)
        {
            g.setAdapter(new ImageAdapter(this,list));
        }

这是我的图像适配器

public class ImageAdapter extends BaseAdapter {
       List<Images> glist = null;
       private String url;
        public ImageAdapter(Context c,List<Images> lst) {
            mContext = c;
            glist = lst;
            int i=0;
            for (Images id : glist) {
                 url = id.getImageURL(); // Getting URL
                 InputStream inStream = null;
                    if (url.startsWith("http")) {

                        url = url.replace(" ", "%20");
                        HttpURLConnection conn;
                        try {
                             conn = (HttpURLConnection)new URL(url).openConnection();
                             conn.setDoInput(true);
                             conn.connect();
                             inStream = conn.getInputStream();
                        } catch (MalformedURLException e) {

                            e.printStackTrace();
                        } catch (IOException e) {

                            e.printStackTrace();
                        }

                    } else {
                        try {
                            inStream = new FileInputStream(url);
                        } catch (FileNotFoundException e) {

                            e.printStackTrace();
                        }
                    }

                     BitmapFactory.Options options = new BitmapFactory.Options();
                     options.inPreferredConfig = Bitmap.Config.RGB_565;
                     options.inPurgeable = true;
                     Bitmap b = BitmapFactory.decodeStream(inStream, null, options);

                     mImageCollection[i]=b;


                i++;
            }
        }

        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            ImageView i = new ImageView(mContext);

            i.setImageBitmap(mImageCollection[position]);
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setLayoutParams(new Gallery.LayoutParams(136, 88));
            return i;
        }

        private Context mContext;
        private String[] mImageURLs = {};
        private Bitmap[] mImageCollection = {};


    }

此抛出错误是因为它不在线程中。如何更改此代码,以便在后台加载URL读取和图像

因此,我使用SmartImageView更改了ImageAdapter,它处理后台线程和缓存

public class ImageAdapter extends BaseAdapter {
       List<ImageGallery> glist = null;
       private String url;
        public ImageAdapter(Context c,List<ImageGallery> lst) {
            mContext = c;
            glist = lst;
            int i=0;
            al = new ArrayList<String>(); 
            for (ImageGallery id : glist) {

                al.add(id.getImageURL());

            }   
        }

        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
           Log.d("deepak", "getview gallery");
            SmartImageView i = new SmartImageView(mContext);
            i.setImageUrl(al.get(position));
            i.setScaleType(ImageView.ScaleType.FIT_XY);
            i.setLayoutParams(new Gallery.LayoutParams(136, 88));
            return i;
        }

        private Context mContext;
        private String[] mImageURLs = {};
        private ArrayList<String> al; 
        private Bitmap[] mImageCollection = {};
        private Integer[] mImageIds = {};

    }

但是我的getView()现在没有被调用


共 (2) 个答案

  1. # 1 楼答案

    您可以使用智能图像视图。SmartImageView是Android标准ImageView的替代品,它还允许从URL或用户联系人通讯簿加载图像。图像被缓存到内存和磁盘,以便超快速加载。 请参阅以下链接以了解更多信息https://github.com/loopj/android-smart-image-view。希望这能帮助你完成任务

  2. # 2 楼答案

    我建议编写一个AsyncImageLoader类,让它处理从http下载的图像。通过这种方式,您可以在单独的线程上缓存和管理所有内容,并在加载完成后将图像设置为视图。如果您想在其他地方下载图像,也可以在整个应用程序中使用该类

    您可以在适配器中调用类似mImageLoader.loadImage(myImageView, Url)的东西,一旦加载完成,它就会将其放入

    如果您需要更多详细信息,请告诉我:)