• Android异步载入全解析之开篇瞎扯淡


    Android异步载入

    概述

    Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作。更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像ListView、GridView这种控件。假设getView的时间太长,就会造成很严重的卡顿,很影响性能。
    本系列将展示在Android中怎样进行异步载入操作,并使用ListView来作为演示的对象。

    怎样下载图像

    下载自然是须要使用网络,使用网络就不能在主线程。在主线程就会爆炸。所以我们必须要在非主线程中去下载图像。OK。那么下载使用的方法呢。许多,这里简单的列举几种

    HttpURLConnection

    private static Bitmap getBitmapFromUrl(String urlString) {
        Bitmap bitmap;
        InputStream is = null;
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            is = new BufferedInputStream(conn.getInputStream());
            bitmap = BitmapFactory.decodeStream(is);
            conn.disconnect();
            return bitmap;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
            }
        }
        return null;
    }

    很easy。甚至都没做超时等处理。这里偷个懒。

    Drawable

    Drawable d = Drawable.createFromStream(is, "url");

    也很easy,仅仅是须要进行下转换。

    ListView

    这一篇作为开篇。我们还是来扯下淡,这个ListView,大家都用过,最经常使用的优化也就是使用ViewHolder模式进行复用,避免反复的inflate和findViewById而影响效率,相信大部分的开发人员都已经熟知,这里我们还是贴下Adapter的代码:

    package com.imooc.listviewacyncloader;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    
    import java.util.List;
    
    public class MyAdapterNotUseCaches extends BaseAdapter {
    
        private LayoutInflater mInflater;
        private List<String> mData;
    
        public MyAdapterNotUseCaches(Context context, List<String> data) {
            this.mData = data;
            mInflater = LayoutInflater.from(context);
        }
    
        @Override
        public int getCount() {
            return mData.size();
        }
    
        @Override
        public Object getItem(int position) {
            return mData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            String url = mData.get(position);
            ViewHolder viewHolder = null;
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.listview_item, null);
                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_item);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.imageView.setTag(url);
            viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
            return convertView;
        }
    
        public class ViewHolder{
            public ImageView imageView;
        }
    }
    

    确实很easy哈。最主要的ViewHolder模式使用ListView。只是,这里有点须要注意的:

    viewHolder.imageView.setTag(url);

    这个事实上是很重要的,为什么重要我们后面会继续说。

    除了这个地方,其他的部分,假设你能独立写出来。相信你已经击败了10%的开发人员了,后面我们再来讲怎样击败剩下90%的开发人员。


    图像

    图像我们能够从网络相冊里面来获取,这里偶然找到郭神的一篇博客里面的图像地址,就无耻的拿来用了:
    public class Images {
    
        public final static String[] IMAGE_URLS = new String[] {
                "http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg",
                "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",
    ……

    那么我们在MainActivity中就能够导入这些图像了:
    package com.imooc.listviewacyncloader;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    
    import java.util.Arrays;
    import java.util.List;
    
    
    public class MainActivity extends Activity {
    
        private ListView mListView;
        private List<String> mData;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mListView = (ListView) findViewById(R.id.lv);
            mData = Arrays.asList(Images.IMAGE_URLS);
            mListView.setAdapter(……);
        }
    }
    

    測试图像搞定~我们后面继续~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


    我的Github
    我的视频 慕课网






  • 相关阅读:
    需求的有序化和方案的系统化
    产品 增长 口碑传播
    私域流量的价值 大悦城微信营销:14万微信会员哪来的
    产品创新阶段关口细则
    业务关键数据指标
    TOB 增长
    医美品零售门店分析
    数据赋能饮品轻食
    [已读]你不知道的JavaScript(上卷)
    [已读]移动web手册
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6935181.html
Copyright © 2020-2023  润新知