第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

LruCache寫完之后沒效果呀?

沒效果的意思是圖片沒有加載進去,一片空白。

代碼:

SimpleImageLoader.java:

package top.omooo.cachedemo.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
* Created by SSC on 2017/12/6.
* 加載網(wǎng)絡(luò)圖片,并緩存圖片到本地和內(nèi)存
*/

public class SimpleImageLoader {
? ?private static SimpleImageLoader mLoader;
? ?private LruCache<String, Bitmap> mLruCache;
? ?private static final String TAG = "SimpleImageLoader";

? ?public static SimpleImageLoader getInstance() {
? ? ? ?if (mLoader == null) {
? ? ? ? ? ?synchronized (SimpleImageLoader.class) {
? ? ? ? ? ? ? ?if (mLoader == null) {
? ? ? ? ? ? ? ? ? ?mLoader = new SimpleImageLoader();
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?return mLoader;
? ?}

? ?/**
? ? * 用來初始化緩存對象
? ? */
? ?private SimpleImageLoader() {
? ? ? ?int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
? ? ? ?mLruCache = new LruCache<String, Bitmap>(maxSize){
? ? ? ? ? ?@Override
? ? ? ? ? ?protected int sizeOf(String key, Bitmap value) {
? ? ? ? ? ? ? ?return value.getByteCount();
? ? ? ? ? ?}
? ? ? ?};
? ?}

? ?/**
? ? * 用來加載網(wǎng)絡(luò)圖片
? ? * @param view
? ? * @param url
? ? */
? ?public void displayImage(ImageView view, String url) {
? ? ? ?Bitmap bitmap = getBitmapFromCache(url);
? ? ? ?if (bitmap != null) {
? ? ? ? ? ?Log.i(TAG, "displayImage bitmap!=null");
? ? ? ? ? ?view.setImageBitmap(bitmap);
? ? ? ?} else {
? ? ? ? ? ?Log.i(TAG, "displayImage bitmap==null");
? ? ? ? ? ?downloadImage(view,url);
? ? ? ? ? ?view.setImageBitmap(getBitmapFromCache(url));
? ? ? ?}
? ?}

? ?/**
? ? * 從緩存中讀取圖片
? ? * @param url
? ? * @return
? ? */
? ?private Bitmap getBitmapFromCache(String url) {
? ? ? ?Log.i(TAG, "getBitmapFromCache");
? ? ? ?return mLruCache.get(url);
? ?}

? ?/**
? ? * 將下載下來的圖片保存到緩存中
? ? * @param bitmap
? ? * @param url
? ? */
? ?private void putBitmapToCache(Bitmap bitmap, String url) {
? ? ? ?if (bitmap != null) {
? ? ? ? ? ?Log.i(TAG, "putBitmapToCache");
? ? ? ? ? ?mLruCache.put(url, bitmap);
? ? ? ?}
? ?}

? ?/**
? ? * 下載圖片,并添加到緩存中
? ? * @param imageView
? ? * @param url
? ? */
? ?private void downloadImage(final ImageView imageView, final String url) {
? ? ? ?OkHttpClient client = new OkHttpClient();
? ? ? ?Request request = new Request.Builder().url(url).build();
? ? ? ?Call call = client.newCall(request);
? ? ? ?call.enqueue(new Callback() {
? ? ? ? ? ?@Override
? ? ? ? ? ?public void onFailure(Call call, IOException e) {
? ? ? ? ? ? ? ?Log.i(TAG, "onFailure");
? ? ? ? ? ?}

? ? ? ? ? ?@Override
? ? ? ? ? ?public void onResponse(Call call, Response response) throws IOException {
? ? ? ? ? ? ? ?Log.i(TAG, "onResponse");
? ? ? ? ? ? ? ?Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
? ? ? ? ? ? ? ?if (bitmap != null) {
? ? ? ? ? ? ? ? ? ?putBitmapToCache(bitmap, url);
? ? ? ? ? ? ? ? ? ?Log.i(TAG, "bitmap不為空");
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ?Log.i(TAG, "bitmap為空");
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?});
? ?}
}

然后在MainActivity里面調(diào)用:

SimpleImageLoader.getInstance().displayImage(mImageView, url);

運行沒效果,嗚嗚嗚


正在回答

2 回答

?@Override
? ? ? ? ? ?public void onResponse(Call call, Response response) throws IOException {
? ? ? ? ? ? ? ?Log.i(TAG, "onResponse");
? ? ? ? ? ? ? ?Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
? ? ? ? ? ? ? ?if (bitmap != null) {
? ? ? ? ? ? ? ? ? ?putBitmapToCache(bitmap, url);
? ? ? ? ? ? ? ? ? ?Log.i(TAG, "bitmap不為空");
? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ?Log.i(TAG, "bitmap為空");
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?});
?上面這個方法的執(zhí)行時異步的

然而在首次加載圖片的時候bitmap == null? 會調(diào)用系統(tǒng)的OKHTTP去下載圖片(這里需要你斷點一下是不是真的下載好了),假設(shè)下載成功了。但是在下載成功之前代碼已經(jīng)執(zhí)行到了?view.setImageBitmap(getBitmapFromCache(url)); 這時候圖片還沒有下載好

?/**
? ? * 用來加載網(wǎng)絡(luò)圖片
? ? * @param view
? ? * @param url
? ? */
? ?public void displayImage(ImageView view, String url) {
? ? ? ?Bitmap bitmap = getBitmapFromCache(url);
? ? ? ?if (bitmap != null) {
? ? ? ? ? ?Log.i(TAG, "displayImage bitmap!=null");
? ? ? ? ? ?view.setImageBitmap(bitmap);
? ? ? ?} else {
? ? ? ? ? ?Log.i(TAG, "displayImage bitmap==null");
? ? ? ? ? ?downloadImage(view,url);
? ? ? ? ? ?view.setImageBitmap(getBitmapFromCache(url));
? ? ? ?}
? ?}





正確的解決是當圖片下載完成了,直接加載給view


?@Override
? ? ? ? ? ?public void onResponse(Call call, Response response) throws IOException {
? ? ? ? ? ? ? ?Log.i(TAG, "onResponse");
? ? ? ? ? ? ? ?Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
? ? ? ? ? ? ? ?if (bitmap != null) {
? ? ? ? ? ? ? ? ? ?putBitmapToCache(bitmap, url);

? ????????????????displayImage(ImageView view, String url);? ? ? ??

????? ? ? ? ? ? ? Log.i(TAG, "bitmap不為空");

? ? ? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ?Log.i(TAG, "bitmap為空");
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?});

這樣就可以了

0 回復 有任何疑惑可以回復我~
#1

Omooo 提問者

謝謝謝謝
2017-12-22 回復 有任何疑惑可以回復我~

視頻里面有遺漏,下載完成還需要在set一下,下載過程是異步的,所以在download后面直接set是不行的。還有一點,okhttp的onResponse是在非UI線程回調(diào),不要直接操作ui

0 回復 有任何疑惑可以回復我~
#1

Omooo 提問者

的確是,現(xiàn)在回頭在來看看以前寫的代碼,發(fā)現(xiàn)問題很多。
2018-09-29 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Bitmap高效緩存
  • 參與學習       6837    人
  • 解答問題       7    個

Bitmap高效加載及Android緩存策略

進入課程

LruCache寫完之后沒效果呀?

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號