图片加载之三级缓存机制、AsyncTask优化、ComViewHolder极致优化ListView、LruCache搭配Runtime完美内存优化

    在网上看到好多加载图片缓存的的博客,但都不太完整,今天给大家介绍一款比较完整的加载图片并且防止加载卡顿优化的代码,并且完美修复未加载出来图片滑动后在另一个页面加载跳动尴尬:
首先,我们来介绍一下加载图片的步骤:
1. 开启子线程去加载图片
2.获得byte[]  三级缓存:2.1  从内存获取 2.2  从磁盘获取2.3  从网络获取
3. 把byte[] 转成bitmap对象
4. 回到主线程 把bitmap对象 设置给ImageView
    其次,再讲解一下优化:
 优化,分为内存优化、线程优化、代码优化:
 1.内存优化

     我们使用系统提供的LruCache方法来优化内存,LruCache就是Least Recent Used Cache的简称,它可以在listView滑动时指定内存大小,超过这个内存就自动释放压在最  后面的内存;

 使用方法:
     ①构造时传入容量,其他用法和Map相似
     ② 重写sizeOf方法,来指定不同元素的权重,也要修改构造容量与之对应
 2.线程优化
 线程池 的构造方法

 3.代码简化 使用AsyncTask
 AsyncTask的优缺点:
 优点:
     易于使用(子线程和主线程切换)
     缺点:都是围绕着线程池的
         1 如果同时给太多的任务去做,队列会爆掉,导致程序崩溃
         2 在旧版(<19)的源码上,最大线程数是128,会导致过多的资源用在线程的切换上
         3 对于不同优先级的任务,不能优先处理,会导致优先级高的迟迟得不到处理
 解决:
     使用两个参数的 executeOnExecutor方法 ,指定满足我们需要的 线程池

 Runtime类可实现获取系统内存

Runtime mRuntime = Runtime.getRuntime();
    { // 代码中的内存 <= app的内存 <-jvm <- 进程 <- os <- 硬件
        // 已经分配,但没有使用的内存
        mRuntime.freeMemory();
        // 已经分配的内存
        mRuntime.totalMemory();
        // 可分配的最大内存
        mRuntime.maxMemory();}


 Pair<F,S>
    new Pair<F,S>(F f,S s)
    Pair.create(F f,S s)
   可使用 pair.first获取里面的第一个引用
    可使用pair.second获取里面的第二个引用

 最后,正确地使用图片工具类需要注意:
 1. 尽量单例地去使用图片加载工具类
 2. 尽量在一个项目中只是用1个图片加载工具类
 3. 如果有可能的化,应该把图片加载工具类封装一把

 4. 缩放图片

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//首先,在layout文件夹创建一个item文件,写一个imageView控件,以适应图片的加载显示位置

<ImageView
        android:id="@+id/item_iv"
        android:layout_width="100dp"
        android:layout_height="100dp"
        />

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//图片加载工具类

public class MyBitmapUtil {
    static Handler handler = new Handler();
    private final File mCacheDir;
    Runtime mRuntime = Runtime.getRuntime();
    {
        // 代码中的内存 <= app的内存 <-jvm <- 进程 <- os <- 硬件
        // 已经分配,但没有使用的内存
        mRuntime.freeMemory();
        // 已经分配的内存
        mRuntime.totalMemory();
        // 可分配的最大内存
        mRuntime.maxMemory();
    }
    LruCache<String, byte[]> cache = new LruCache<String, byte[]>((int) (mRuntime.maxMemory() / 8)) { //mRuntime.maxMemory() / 8是为适应不同RAM机型适配分配内存
        @Override
        protected int sizeOf(String key, byte[] value) {
            return value.length;
        }
    };
//    Map<String, byte[]> cache = new HashMap<>();
    public MyBitmapUtil(Context context) {
        mCacheDir = new File(Environment.getExternalStorageDirectory(), "/MBU/" + context.getPackageName());
        mCacheDir.mkdirs();
    }
    private ThreadPoolExecutor mThreadPoolExecutor = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    public void display(ImageView iv, String url) {
//        iv.setImageResource(R.mipmap.ic_launcher);
//        1 开启子线程去加载图片
//        new Thread(new LoadImageRunnable(iv, url)).start();
        iv.setImageBitmap(null);
        // 做标记
        iv.setTag(url);
//        mThreadPoolExecutor.execute(new LoadImageRunnable(iv, url));
        new LoadImageTask().execute(Pair.create(url, iv));
//        new LoadImageTask().executeOnExecutor(,Pair.create(url, iv));
    }
    private Bitmap getBitmap(byte[] bytes, ImageView imageView) {
        BitmapFactory.Options option = new BitmapFactory.Options();
        option.inJustDecodeBounds = true;
        BitmapFactory.decodeByteArray(bytes, 0, bytes.length, option);
        int outHeight = option.outHeight;
        int outWidth = option.outWidth;
        float scaleH = 1.0f * outHeight / imageView.getHeight();
        float scaleW = 1.0f * outWidth / imageView.getWidth();
        float scale = scaleH > scaleW ? scaleH : scaleW;
        option.inSampleSize = (int) scale;
        option.inJustDecodeBounds =false;
//        Bitmap before = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
        Bitmap after = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, option);
//        Log.d("getBitmap" , before.getByteCount() + "   " + after.getByteCount());

        return after;
    }
    private byte[] getBytes(String url) throws IOException {
        byte[] result = null;
//        2.1  从内存获取
        result = readFromMem(url);
        if (result != null) {
            Log.d("getBytes", "内存");
            return result;
        }
//        2.2  从磁盘获取
        result = readFromDisk(url);
        if (result != null) {
            Log.d("getBytes", "磁盘");
            writeToMem(url, result);
            Log.d("getBytes", "cache " + cache.size());
            return result;
        }
//        2.3  从网络获取
        result = readFromNet(url);
        Log.d("getBytes", "网络");
        writeToDisk(url, result);
        writeToMem(url, result);
        return result;
    }
    private byte[] readFromMem(String url) {
        return cache.get(url);
    }
    private void writeToMem(String url, byte[] bytes) {
        cache.put(url, bytes);
    }
    private byte[] readFromDisk(String url) throws IOException {
//        url-> File  -> FileInputStream -> ByteArrayOutputStream -> byte[]
        File file = getFile(url);
        if (!file.exists()) {
            return null;
        }
        FileInputStream fis = null;
        ByteArrayOutputStream baos = null;
        try {
            fis = new FileInputStream(file);
            baos = new ByteArrayOutputStream();
            copyStream(fis, baos);
            return baos.toByteArray();
        } finally {
            closeStream(fis);
            closeStream(baos);
        }
    }
    private void writeToDisk(String url, byte[] bytes) throws IOException {
        // 写入磁盘 = 写入文件
        // 文件 = 文件夹 + 文件名
        File file = getFile(url);
        // file -->fileOutputStream --> 写入
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(bytes);
        } finally {
            closeStream(fileOutputStream);
        }
    }
    private File getFile(String url) {
        // 文件 = 文件夹 + 文件名
        // 文件名的要求: 1 不重复 2 合法 3 同一个url应该得到同一个文件
        // md5 去弄文件名
        return new File(mCacheDir, md5(url));
    }
    private byte[] readFromNet(String urlString) throws IOException {
        //  url -> InputStream -> ByteArrayOouputStream ->byte[]
        URL url = new URL(urlString);
        InputStream inputStream = null;
        ByteArrayOutputStream baos = null;
        try {
            inputStream = url.openStream();
            baos = new ByteArrayOutputStream();
            copyStream(inputStream, baos);
            return baos.toByteArray();
        } finally {
            closeStream(inputStream);
            closeStream(baos);
        }
    }
    private static void closeStream(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    private static void copyStream(InputStream is, OutputStream os) throws IOException {
        int len = 0;
        byte[] buf = new byte[1024];
        while ((len = is.read(buf)) != -1) {
            os.write(buf, 0, len);
        }
    }
    private class LoadImageTask extends AsyncTask<Pair<String,ImageView> ,Void,Pair<Bitmap,Pair<String, ImageView>>>{
        @Override
        protected Pair<Bitmap, Pair<String, ImageView>> doInBackground(Pair<String, ImageView>... params) {
            Pair<String, ImageView> param = params[0];
            try {
                //            2 获得byte[]
                byte[] bytes = getBytes(param.first);
//            3 把byte[] 转成bitmap对象
                Bitmap bitmap = getBitmap(bytes, param.second);
//
                return new Pair<Bitmap, Pair<String, ImageView>>(bitmap,param);
            } catch (Exception e) {
                e.printStackTrace();
                 return null;
            }
        }

        @Override
        protected void onPostExecute(Pair<Bitmap, Pair<String, ImageView>> result) {
            if(result.second.first.equals( result.second.second.getTag()) ){ // 检查标记
                result.second.second.setImageBitmap(result.first);
            }
        }
    }

    public static String md5(String md5) {
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte[] array = md.digest(md5.getBytes());
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < array.length; ++i) {
                sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
            }
            return sb.toString();
        } catch (java.security.NoSuchAlgorithmException e) {
        }
        return null;
    }

}

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//然后在layout文件夹main_activity文件中写一个ListView控件用来填充Activity

<ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//在mainActivity中写入以下代码;

public class MainActivity extends Activity {
    private MyBitmapUtil mMyBitmapUtil;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMyBitmapUtil = new MyBitmapUtil(this);
        ListView listView = (ListView) findViewById(R.id.lv);
        listView.setAdapter(mBaseAdapter);
    }

    private BaseAdapter mBaseAdapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return list == null  ? 0 : list.size();
        }

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

       //CommonViewHolder 是急剧优化的listView;其有3个优点:

       //1、减少findviewById的次数

       //2.复用convertView,防止oom

       //3.增强代码复用性

            CommonViewHolder cvh = CommonViewHolder.createCVH(convertView,parent,R.layout.item);
            mMyBitmapUtil.display(cvh.getIv(R.id.item_iv) , list.get(position));
            return cvh.convertView;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }
    };

//往集合中添加测试数据;

    List<String> list = new ArrayList<>();

    //添加测试数据 

{
        list.add("http://ym.zdmimg.com/201509/08/55ee8ba231eb5.jpg_d200.jp");
        list.add("http://ym.zdmimg.com/201509/08/55ee9c5c41a7c1420.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee87f4a92e8.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee96852b351.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9aece0a8d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7c2110f12.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7c0a21d4b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee87a3d180e.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee91be9d6f1.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee98c5825036013.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9936cc58d1475.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7c426517a.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee94e87bdd75719.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee93e07603c2316.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee866fd49e7.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee932392cdc8792.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee937cce6f6622.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee92b971f3c2272.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee91c3a890c5538.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9146d5d2b5060.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8d42bf4aa.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea03e15dd3.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8ba73d873.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8634b6972.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8a67e9992.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea457dd5693052.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9c70c4fc92262.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea2d11f3c53202.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea250a8f2c8031.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee88c9e2c76.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee996f837834313.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea1d6ab88d133.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9de545d44907.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee98070351d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7f2f60e87.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea0f2689b28273.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea551018104929.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7e4fd37ef.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee84fe7bae1.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9daa4c7624200.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeb92aa198b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9eaf9c6aa.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeb17b5530d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeb1df21c972378.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee975725611.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8a04cc706.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeab36932ad5689.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/02/55e6e7520c3ae.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9ad536ca4.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea92e7fca27576.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeac17d97a94050.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea2ede8fbd.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea638e64fc7135.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea579e701f.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea3992a48f2235.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeaa4da9d3c6655.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8e04aabf1.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9a097492f.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea0678ae44.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea58f3cbb23749.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeab4936ff9.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeb1a08dbc5.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea820a046b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eed58996d9a.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eed339177be.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea2147dd35.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee9f96ab830.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee99135aa38.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee957da4931.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eec71f0ec2c.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eecd220e375.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eea6a376dae.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee8dee3634f.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eeccf48cd05554.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee87baee15c.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eebf3945a967120.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eebfc09cdf7.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eec347045023508.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7f45bf95a.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55eebe606f33f5785.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee774fb74396631.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5a66a0085.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7899600a34093.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee77340f62a6023.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6337431c7.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee681e72cf7.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee68d19b580.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee76f96dcbe1795.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee77517e7aa4763.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee690da1cb7.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee76b2b67402598.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee56ee736a2.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6b250c263.jpg_d200.jpg");
        list.add("http://y.zdmimg.com/201509/08/55ee754a22211804.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5ef7d1379.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5c9a98eb9.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee75cf414888161.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee56c049c0d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5c3f9cf24.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5c6f3ae3a.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7e21a752e7273.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee608270a1f.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee79a41818e.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7a4e07f3f.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee79125c592.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7b2fcc3bf3950.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee706f4b313.jpg_d200.jpg");
        list.add("http://y.zdmimg.com/201509/08/55ee7b2c047af3821.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7c6f27e7d8640.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee92b669e756330.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7dec5b0ec7524.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6b0a1d711.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7b03b9278.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6132bbf40.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee78175224b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6349d301d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6e4fc6ea3.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee79a31bf0850.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee785e28145.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee79c432a109259.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6f00a08d2.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6a4faa013.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee81d96cbad8062.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7a83b30cd.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6f65a5951.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee75496f62d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee62c0b5169.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5a9d72e12.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee77a18f2fe.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee77a873aef.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7f6e312ef8246.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6530bdd9d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7f7b543b8103.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee714cd41dc.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7ee306868.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5168708fa.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6458261f4.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7ecf72728186.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee59fc06b84.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7dcb852d28792.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee69a657606.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7a5422a7b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee87dfde4308497.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7b363e861.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7fd328dde.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee87457f3699073.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee86a26cd104681.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7e4e72938.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee7f969e74e.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee84d70a822779.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee84c3d20604695.png_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee65e902d6e.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee817a83b8b.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee83b3e26902687.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/05/55ea48ec3d917.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee5fa77fd15.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee750fc70f1.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee700df0aed.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/07/55ed92b1c5f7d.jpg_d200.jpg");
        list.add("http://ym.zdmimg.com/201509/08/55ee6d69d4602.jpg_d200.jpg");
    }

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 // 通用的ViewHoder,防止内存移除使用,比通常优化的ViewHolder更实用,用集合<View> 来代替多个成员变量 ,然后用同一个方法传入不同的id,来拿到需要的小控件

public class CommonViewHolder {
    public final View convertView;
    private Map<Integer, View> views = new HashMap<>();
    private CommonViewHolder(View convertView) {
        this.convertView = convertView;
    }
    public static CommonViewHolder createCVH(View convertView, ViewGroup parent, int layoutRes) {
        if (convertView == null) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            convertView = layoutInflater.inflate(layoutRes, parent, false);
            CommonViewHolder cvh = new CommonViewHolder(convertView);
            convertView.setTag(cvh);
        }
        //            SingleNews singleNews = mNewsInListView.get(position);
        CommonViewHolder cvh = (CommonViewHolder) convertView.getTag();
        return cvh;
    }
    //        public void putView(int id,View view){
//            views.put(id,view);
//        }
    public View getView(int id) {
        if (views.get(id) == null) {
            views.put(id, convertView.findViewById(id));
        }
        return views.get(id);
    }
       //获取Tv类型控件
    public TextView getTv(int id) {
        return ((TextView) getView(id));
    }
       //获取iv类型控件
    public ImageView getIv(int id) {
        return ((ImageView) getView(id));
    }
}


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值