Android加载用户头像的功能实现

加载用户头像的过程是,首先从本地查看是否存储了用户的头像,如果有,则从本地读取后加载到ImageView中,如果没有,则去服务器下载头像保存到本地,并加载。

public void initData() {
   
        super.initData();
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext());
        final String u_id = pref.getString("u_id", "");
        // 联网请求个人中心的数据
        getDataFromServer(u_id);
    }

在Fragment的onCreateView()中调用initData()方法,该方法使用用户的id去联网请求个人中心的数据。

private void getDataFromServer(String u_id) {
   
        String address = Constant.PERSONAL_CENTER_URL;
        HttpUtil.sendPostRequest(address, u_id, new Callback() {
   
            @Override
            public void onFailure(Call call, IOException e) {
   

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
   
                if (null == response.body()) {
   
                    return;
                }

                String responseText = URLDecoder.decode(response.body().string(), "utf-8");
                // 解析数据
                processData(responseText);
            }
        });
    }

在 getDataFromServer()方法中调用了自己写的HttpUtil工具类中的方法去请求服务器数据。这个HttpUtil的方法如下(使用前需在gradle文件中引入okhttp3):

public class HttpUtil {
   
	public static void sendPostRequest(String address, String json, okhttp3.Callback callback) {
   
	        OkHttpClient client = new OkHttpClient();
	        RequestBody requestBody = RequestBody.create(JSON, json);
	        Request request = new Request.Builder().url(address).post(requestBody).build();
	        client.newCall(request).enqueue(callback);
	    }
}

下面进入解析数据的部分,取出客户端返回的数据,用Gson转换为PersonMsg对象后取出User,用这个User中的数据来更新界面。从User中取出用户id,利用id去sd卡中获取到压缩后的Bitmap位图(这里是个大坑,不压缩很容易造成内存溢出OOM的错误,填坑请看我另一篇博文:解决使用Bitmap造成OOM内存溢出的问题)。如果取出的Bitmap不为空,则表示从本地加载到了用户头像,否则就从服务器请求头像数据。

    private void processData(String response) {
   
        final PersonMsg personMsg = Utility.handlePersonMsgResponse(response);
        if (null == personMsg) {
   
            return;
        }

        final User user = personMsg.getUser();

        // 更新界面
        if (getActivity() == null) {
   
            return;
        }

        final Bitmap bitmap = ImageUtils.getPhotoFromStorage(user.getU_id());
        if (bitmap != null) {
   
            getActivity().runOnUiThread(new Runnable() {
   
                @Override
                public void run() {
   
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Android 头像本地缓存的实现方法: 1. 使用内存缓存 在应用中定义一个 LruCache 对象,用于保存最近使用的头像图像。在加载头像时,先从 LruCache 中查找对应的图像,如果存在则直接返回,否则从网络或者本地文件系统中加载图像,并将其保存到 LruCache 中。 ```java // 定义一个 LruCache 对象 private LruCache<String, Bitmap> mMemoryCache; // 初始化 LruCache 对象 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount() / 1024; } }; // 加载头像时,先从 LruCache 中查找对应的图像 Bitmap bitmap = mMemoryCache.get(key); if (bitmap != null) { // 图像已经缓存在内存中,直接返回 return bitmap; } else { // 图像还没有缓存,从网络或者本地文件系统中加载,并保存到 LruCache 中 // ... mMemoryCache.put(key, bitmap); return bitmap; } ``` 2. 使用磁盘缓存 使用 DiskLruCache 将头像图像保存到本地文件系统中。在加载头像时,先从磁盘缓存中查找对应的图像,如果存在则直接返回,否则从网络中加载图像,并将其保存到磁盘缓存中。 ```java // 初始化 DiskLruCache 对象 File cacheDir = getDiskCacheDir(context, "avatar"); int cacheSize = 10 * 1024 * 1024; // 10MB DiskLruCache mDiskLruCache = DiskLruCache.open(cacheDir, 1, 1, cacheSize); // 加载头像时,先从磁盘缓存中查找对应的图像 String key = hashKeyForDisk(url); DiskLruCache.Snapshot snapshot = mDiskLruCache.get(key); if (snapshot != null) { // 图像已经缓存在磁盘中,直接返回 FileInputStream inputStream = (FileInputStream) snapshot.getInputStream(0); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap; } else { // 图像还没有缓存,从网络中加载,并保存到磁盘缓存中 // ... DiskLruCache.Editor editor = mDiskLruCache.edit(key); OutputStream outputStream = editor.newOutputStream(0); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); editor.commit(); return bitmap; } ``` 3. 使用第三方库 使用 Glide、Picasso 等开源库来加载和缓存头像图像。这些库已经实现了完善的缓存机制,可以大大简化开发流程。 例如,使用 Glide 加载头像时,可以通过以下代码实现自动缓存: ```java Glide.with(context) .load(url) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(imageView); ``` 以上是 Android 头像本地缓存的简单实现方法,具体实现方式可以根据项目需求和技术栈进行调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值