就下面三个文件
ListActivity.java调用MyBaseAdapter
MyBaseAdapter调用showImageByAsyncTask
从运行log来看,可以存进去,但取不出来
如下代码ListActivity.javapackage 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.javapackage 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;
    }
}

解决方案 »

  1.   

    ImageLoader.javapackage 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);
                    }
                }
            }
        };}