lruCache取不到缓存问题

jxhj 2015-11-22 04:17:15
就下面三个文件
ListActivity.java调用MyBaseAdapter
MyBaseAdapter调用showImageByAsyncTask
从运行log来看,可以存进去,但取不出来
如下代码

ListActivity.java

package net.kuimao.app.kuimaoapp;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;

import net.kuimao.app.utils.HttpUtils;
import net.kuimao.app.utils.OtherUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class ListActivity extends AppCompatActivity {

private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_lv);
lv = (ListView) findViewById(R.id.listView);

new Thread() {
public void run() {
Map<String, String> query = new TreeMap<>();
query.put("m", "user");
query.put("a", "getUserList");
String url = OtherUtils.getSignURL(query);
Map result = HttpUtils.doGet(url);

//先将返回流数据显示出来调试
Log.d("hj-ba", url);
Log.d("hj-ba", result.get("code") + " " + result.get("message"));

if (Integer.parseInt(result.get("code").toString()) == 200) {
Message msg = new Message();
msg.what = 200;
msg.obj = result.get("body");
handler.sendMessage(msg);
} else {
String info = result.get("code") + ": " + result.get("message");
Log.d("hj-ba", info);
}
}
}.start();
}

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 200) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject((String) msg.obj);
if (jsonObject.getString("data").length() > 0) {
List<Map<String, Object>> data = new ArrayList<>();
//里面有一个数组数据,可以用getJSONArray获取数组
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
//得到每个对象
JSONObject item = jsonArray.getJSONObject(i);
Map<String, Object> map = new HashMap<>();
map.put("id", item.getString("id"));
map.put("title", item.getString("nickname") + item.getString("id"));
map.put("info", item.getString("country") + item.getString("province") + item.getString("city"));
//只传图片网址
map.put("photo", item.getString("photo"));
data.add(map);
}
//调用MyAdapter生成页面
MyBaseAdapter adapter = new MyBaseAdapter(ListActivity.this, data);
lv.setAdapter(adapter);
} else {
//没有数据
Log.d("hj-ba", "没有数据");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.menu_action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}


MyBaseAdapter.java

package net.kuimao.app.kuimaoapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import net.kuimao.app.utils.ImageLoader;

import java.util.List;
import java.util.Map;

public class MyBaseAdapter extends BaseAdapter {

private ImageLoader mImageLoader;
private LayoutInflater mInflater;
private List<Map<String, Object>> mData;

public MyBaseAdapter(Context context, List data) {
mImageLoader = new ImageLoader();
mInflater = LayoutInflater.from(context);
mData = data;
}

@Override
public int getCount() {
return mData.size();
}

@Override
public Object getItem(int position) {
return mData.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
//covertView是从布局文件中inflater来的布局
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.activity_list_item, null);
holder.ivPhoto = (ImageView) convertView.findViewById(R.id.photo);
holder.tvTitle = (TextView) convertView.findViewById(R.id.title);
holder.tvInfo = (TextView) convertView.findViewById(R.id.info);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.ivPhoto.setTag(mData.get(position).get("id"));
holder.ivPhoto.setImageResource(R.drawable.loading);
mImageLoader.showImageByAsyncTask(
holder.ivPhoto,
(String) mData.get(position).get("photo"),
(String) mData.get(position).get("id")
);
holder.tvTitle.setText((String) mData.get(position).get("title"));
holder.tvInfo.setText((String) mData.get(position).get("info"));

return convertView;
}

//ViewHolder用来存页面控件
class ViewHolder {
public ImageView ivPhoto;
public TextView tvTitle;
public TextView tvInfo;
}
}

...全文
258 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37353043 2019-03-11
  • 打赏
  • 举报
回复
是不是因为缓存对象重新先创建了 导致新对象里面没数据?
xautlily 2016-04-28
  • 打赏
  • 举报
回复
我也碰到了这个问题,你有没有解决?
jxhj 2015-11-22
  • 打赏
  • 举报
回复
ImageLoader.java

package net.kuimao.app.utils;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

import java.util.Map;

public class ImageLoader {

    private  LruCache<String, Object> mMemoryCaches;
    private ImageView ivImage;
    private String mTagKey;
    private String mUrl;

    public ImageLoader() {
        //本应用程序可用内存
        int maxMemory = (int) Runtime.getRuntime().maxMemory() / 1024;
        //图片缓存,可用的4分之1
        int cacheSize = maxMemory / 4;
        //Log.d("HJ-ImageLoad-maxMemory", String.valueOf(maxMemory));
        //Log.d("HJ-ImageLoad-cacheSize", String.valueOf(cacheSize));
        //初始化LruCache
        mMemoryCaches = new LruCache<String, Object>(cacheSize) {
            @Override
            protected int sizeOf(String key, Object value) {
                //在每次存入缓存时调用,重写此方法来衡量每张图片的大小,默认返回图片数量。
                return value.toString().length();
            }
        };
    }

    //增加到缓存
    public void addBitmapToMemoryCache(String key, Object value) {
        Log.d("HJ-Cache-Put", key + value);
        mMemoryCaches.put(key, value);
    }

    //从缓存中取得数据
    public Object getBitmapFromMemoryCache(String key) {
        Log.d("HJ-Cache-Get", key + mMemoryCaches.get(key));
        return mMemoryCaches.get(key);
    }

    public void showImageByAsyncTask(ImageView ivPhoto, final String photoUrl, final String keyword) {
        Bitmap bitmap = (Bitmap) getBitmapFromMemoryCache(keyword);
        if (bitmap == null) {
            /**
             * 生成MyAsyncTask类的对象,并调用execute方法之后
             * 首先执行的是onProExecute方法
             * 其次执行doInBackgroup方法
             */
            new MyAsyncTask(ivPhoto, keyword).execute(photoUrl);
        } else {
            ivPhoto.setImageBitmap(bitmap);
        }
    }

    /**
     * 生成该类的对象,并调用execute方法之后
     * 首先执行的是onProExecute方法
     * 其次执行doInBackgroup方法
     */
    private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {

        private ImageView mImageView;
        private String mKeyword;

        public MyAsyncTask(ImageView imageView, String keyword) {
            mImageView = imageView;
            mKeyword = keyword;
        }

        // 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。
        // 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。
        // 可以调用publishProgress方法触发onProgressUpdate对UI进行操作或更新任务的进度
        // 这里的Bitmap返回值对应AsyncTask的第三个参数
        // 这里的参数对应的是execute(photoUrl)里的photoUrl,也就是AsyncTask的第一个参数
        @Override
        protected Bitmap doInBackground(String... params) {
            Map result = HttpUtils.doGetImage(params[0]);
            addBitmapToMemoryCache(params[0], result.get("body"));
            return (Bitmap) result.get("body");
        }

        // 相当于Handler 处理UI的方式,此方法在主线程执行
        // 此处的参数bitmap为doInBackground执行完后返回的结果
        // 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (mImageView.getTag().equals(mKeyword)) {
                mImageView.setImageBitmap(bitmap);
            }
        }

        //该方法运行在UI线程当中
        @Override
        protected void onPreExecute() {
            //开始执行异步线程
        }

        /**
         * 这里的Intege参数对应AsyncTask中的第二个参数
         * 在doInBackground方法当中,每次调用publishProgress方法都会触发onProgressUpdate执行
         * onProgressUpdate是在UI线程中执行
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            //int vlaue = values[0];
            //progressBar.setProgress(vlaue);
        }
    }

    public void showImageByThread(ImageView ivPhoto, final String photoUrl, final String keyword) {
        ivImage = ivPhoto;
        mTagKey = keyword;
        mUrl = photoUrl;

        if (mUrl.length() == 0) {
            Log.e("HJ-ImageLoad", "没有图片网址");
            return;
        }

//        //从缓存取图片
        Object bitmap = getBitmapFromMemoryCache(mUrl);
        if (bitmap != null) {
            Log.d("HJ-ImageLoad", "图片来自缓存");
            if (ivImage.getTag().equals(mTagKey)) {
                ivImage.setImageBitmap((Bitmap) bitmap);
            }
            return;
        }

        new Thread() {
            @Override
            public void run() {
                try {
                    Log.d("HJ-ImageLoad", "图片来自网络下载");
                    Map result = HttpUtils.doGetImage(mUrl);
                    //先将返回流数据显示出来调试
                    Log.d("HJ-ImageLoad", mTagKey);
                    Log.d("HJ-ImageLoad", mUrl);
                    Log.d("HJ-ImageLoad", result.get("code") + " " + result.get("message"));

                    if (Integer.parseInt(result.get("code").toString()) == 200) {
                        Message msg = new Message();
                        msg.what = 200;
                        msg.obj = result.get("body");
                        handler.sendMessage(msg);
                    } else {
                        String info = result.get("code") + ": " + result.get("message");
                        System.out.println(info);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    //只能在主线程中改变UI的值,显示相片
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 200) {
                //增加图片到缓存
                addBitmapToMemoryCache(mUrl, msg.obj);
                if (ivImage.getTag().equals(mTagKey)) {
                    ivImage.setImageBitmap((Bitmap) msg.obj);
                }
            }
        }
    };

}

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧