中级实训Android学习记录——项目3制作

学习记录 2020/11/27

  • 使用图片加载库Picasso出现问题,无法加载图片

    • 解决方法:
      为应用加上网络的访问权限

      <uses-permission android:name="android.permission.INTERNET" />
      
  • 使用RecyclerView的Adapter去增加或减少list中的项数的时候,最后需要notify一下

    • 示例:

       public void addItem(String url) {
           list.add(url);
           notifyItemInserted(list.size()-1);
           // 提醒列表中插入个项的位置
       }
      
       public void clearItems() {
           list.clear();
           notifyDataSetChanged();
           // 提醒刷新整个列表
       }
      
  • Picasso的一般用法

    Picasso picasso = Picasso.get();
    picasso.load(list.get(position))
         .placeholder(R.mipmap.ic_launcher)//占位图
         .error(R.drawable.ic_launcher_background) //加载失败的图
         .fit()//充满
         .into(holder.imageView);//加载到的ImageView
    

    此时其实会有图片问题,如果ImageView的设置height是wrap_content,那么最后的height会和placeholder中的图片一样高,而不是和加载的图片一样高。

    而fit会帮我们降低分辨率并将图片以当前的宽高进行拉伸,所以我们最后得到的图片可能并不美观。(目前未解决,只能在xml文件中设置宽和高,或者调用resize)

学习记录 2020/12/12

  • 继续之前使用Picasso库进行项目三

    • 出现错误:
      Picasso并未提供清除缓存的接口

      解决方法:

      改用ImageLoader库来实现项目三

  • 使用ImageLoader库实现项目三

    • 引用之前实现的RecyclerView的模板,将HolderImageViewImageLoaderdisplay方法来从网络/本地加载图片
  • 遇到的困难

    • 首先,如同相似的网络请求一样,我们需要设定权限问题

      // AndroidManifest.xml
      	<uses-permission android:name="android.permission.INTERNET"/>
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      

      如上

    • 在过程中发现,仅仅是请求网络和存储的权限并不够还需要ClearTextTraffic的权限

      AndroidManifest.xml中的application中插入以下语句

      // AndroidManifest.xml
      <application
      	...
      	android:usesCleartextTraffic="true"
      	...
      </application>
      
    • 在使用RecyclerView时,在更新数据的时候不小心使用了notifyAll(),以为他就是刷新数据用的

      使用notifyDataSetChanged();来代替notifyAll()

    • 在用ImageLoader清空缓存时,我发现仅调用clearMemoryCache()方法是不够的

      需要继续调用另一个方法:

       public void delete() {
           this.imageLoader.clearMemoryCache();
           this.imageLoader.clearDiskCache();
       }
      

      需要上述两个方法一同调用才可以,因为我们的DisplayImageOptions设置了

      .cacheInMemory(true)// 设置下载的图片是否缓存在内存中
      .cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
      

      这个设置说明图片既可以存在缓存中,也可以存在SD卡中,所以我们需要清除两个Cache才行

  • 实现效果

查看图片 清除
image-20201212201804811 image-20201212201840617
清除后加载(速度较快) 删除缓存后加载(速度较慢)
image-20201212201918755 image-20201212201945217
posted @ 2020-11-28 20:42  沐锋丶  阅读(74)  评论(0编辑  收藏  举报