android-smart-image-view源码分析,分享面试,体系面试一般问些什么

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

mHandler.sendMessage(msg);

}

} catch (Exception e) {

e.printStackTrace();

}

};

}.start();

}

}

布局文件中引入我们定义的控件:

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<Button

android:id=“@+id/btn”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“onClick”

android:text=“获取网络图片” />

<com.example.smartimageview.SmartImageView

android:id=“@+id/iv_coco”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_below=“@+id/btn”

android:scaleType=“fitXY” />

主Activity中使用我们刚刚定义的控件:

package com.example.smartimageview;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.View;

import android.view.View.OnClickListener;

public class MainActivity extends ActionBarActivity implements OnClickListener{

String mUrl = “http://e.hiphotos.baidu.com/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50/sign=79b94a3be21190ef15f69a8daf72f673/bd3eb13533fa828b5a920735f81f4134960a5ab7.jpg”;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

@Override

public void onClick(View v) {

if (v.getId() == R.id.btn) {

SmartImageView siv = (SmartImageView) findViewById(R.id.iv_coco);

siv.setImageUrl(mUrl);

}

}

}

效果图如下:

OK!已经完成主要功能。不过只是简单的完成了下载图片和显示图片的功能,但是并未涉及到图片的缓存,压缩,以及错处理等情况。所以需要一步一步去拓展。比如可以在返回的Code不为200时,加个else并发个消息给Handler,在Handler中去处理加载失败显示的错误图片资源就好。

三、源码分析

==========

从github上clone该项目,可以看到整个项目的代码只包含7个Java源文件,同时,还可进行扩展,方便使用者根据实际图片的来源进行扩展。我们来看看Class逻辑图:

上面有提到,SmartImageView继承自ImageView并自定义了一些方法,能够方便的显示网络图片。在Android中,图片的显示最终都绘制到画布canvas上以位图的形式显示,所以通过逻辑图可以看出定义了一个 SmartImage 接口,而里面有一个返回值为Bitmap的getBitmap方法:

package com.loopj.android.image;

import android.content.Context;

import android.graphics.Bitmap;

public interface SmartImage {

public Bitmap getBitmap(Context context);

}

为什么会定义这个getBitmap方法呢,因为需要加载的图片来源是不一样的,如:从网络加载或从系统联系人头像加载,所以分别让不同来源的类去实现这个接口,然后在该方法中处理逻辑。如图:

我们来看下这三个类的具体代码:

  • 【BitmapImage(仅仅是传入Bitmap的实例然后返回)】---->

package com.loopj.android.image;

import android.content.Context;

import android.graphics.Bitmap;

/**

  • 实现SmartImage接口

*/

public class BitmapImage implements SmartImage {

//定义Bitmap对象

private Bitmap bitmap;

//构造方法

public BitmapImage(Bitmap bitmap) {

this.bitmap = bitmap;

}

//实现getBitmap方法

public Bitmap getBitmap(Context context) {

return bitmap;

}

}

  • 【WebImage(根据Url获取图片资源,需要注意的是这里用到了缓存,注意代码注释)】---->

package com.loopj.android.image;

import java.io.InputStream;

import java.net.URL;

import java.net.URLConnection;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

public class WebImage implements SmartImage {

//超时设置

private static final int CONNECT_TIMEOUT = 5000;

private static final int READ_TIMEOUT = 10000;

//缓存对象

private static WebImageCache webImageCache;

//WebImage的构造方法,获取URL

private String url;

public WebImage(String url) {

this.url = url;

}

//实现方法,处理相应的业务逻辑

public Bitmap getBitmap(Context context) {

// Don’t leak context

if(webImageCache == null) {

webImageCache = new WebImageCache(context);

}

// Try getting bitmap from cache first

//此处做了简单的二级缓存(内存缓存和磁盘缓存)

Bitmap bitmap = null;

if(url != null) {

//先从缓存获取bitmap对象

bitmap = webImageCache.get(url);

if(bitmap == null) {

//未找到则从网络加载

bitmap = getBitmapFromUrl(url);

if(bitmap != null){

//加载后将bitmap对象put到缓存中

webImageCache.put(url, bitmap);

}

}

}

return bitmap;

}

/**

  • 根据Url获取网络图片资源
  • @param url
  • @return

*/

private Bitmap getBitmapFromUrl(String url) {

Bitmap bitmap = null;

try {

URLConnection conn = new URL(url).openConnection();

conn.setConnectTimeout(CONNECT_TIMEOUT);

conn.setReadTimeout(READ_TIMEOUT);

bitmap = BitmapFactory.decodeStream((InputStream) conn.getContent());

} catch(Exception e) {

e.printStackTrace();

}

return bitmap;

}

/**

  • 提供移除缓存的方法
  • @param url

*/

public static void removeFromCache(String url) {

if(webImageCache != null) {

webImageCache.remove(url);

}

}

}

  • 【ContactImage(系统联系人头像的获取,通过在构造函数传入联系人的ID,然后在getBitmap方法中根据ID查找对应的联系人头像)】---->

package com.loopj.android.image;

import java.io.InputStream;

import android.content.ContentUris;

import android.content.ContentResolver;

import android.content.Context;

import android.provider.ContactsContract;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

/*

  • 获取联系人头像资源

*/

public class ContactImage implements SmartImage {

/****************************************************************************************************

  • 注:Android系统中访问其他app的数据时,一般都是通过ContentProvider实现,
  • 一个ContentProvider类实现了一组标准的方法接口,能够让其他app保存或者读取它提供的各种数据类型。
  • 其他app通过ContentResolver接口就可以访问ContentProvider提供的数据。
  • 备注:(获取的是手机的联系人头像,而不是Sim卡中的联系人头像的。Sim卡由于容量限制等原因,无联系人头像数据)
    • –使用时记得添加获取联系人头像的权限

*****************************************************************************************************/

//联系人头像ID

private long contactId;

public ContactImage(long contactId) {

this.contactId = contactId;

}

public Bitmap getBitmap(Context context) {

Bitmap bitmap = null;

//获取ContentResolver实例

ContentResolver contentResolver = context.getContentResolver();

try {

//根据ID生成查找联系人的Uri

/*

关于withAppendedId方法:

Open Declaration Uri android.content.ContentUris.withAppendedId(Uri contentUri, long id)

Appends the given ID to the end of the path.

Parameters:

contentUri – to start with

id – to append

Returns:

a new URI with the given ID appended to the end of the path */

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);

//调用Contact类中的openContactPhotoInputStream获得图像InputStream对象

InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri);

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2021最新上万页的大厂面试真题

[外链图片转存中…(img-jHBjLzZa-1713442259530)]

七大模块学习资料:如NDK模块开发、Android框架体系架构…

[外链图片转存中…(img-HabfssH7-1713442259530)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-LQa7OczJ-1713442259530)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值