加载图片带缓存--狸菇凉_

从网上加载图片,图片不会错乱,可以缓存

好几个类

封装类就不写了Bean包的MenuInfo

为了代码的整齐,几乎每一个类都是分包操作


ImageLoaderAsyncTask类异步图片加载类,

public class ImageLoaderAsyncTask extends AsyncTask <String,Void,Bitmap>{

 

    private ImageCallBack imageCallBack;

 

 

    public interface ImageCallBack{

 

        void callBack(Bitmap bitmap);

 

    }

 

    public ImageLoaderAsyncTask(ImageCallBack imageCallBack){

            this.imageCallBack = imageCallBack;

    }

 

    @Override

    protected void onPostExecute(Bitmap bitmap) {

        super.onPostExecute(bitmap);

 

        imageCallBack.callBack(bitmap);

 

    }

 

    @Override

    protected Bitmap doInBackground(String... params) {

        try {

            String path = params[0];

 

            URL url = new URL(path);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestMethod("GET");

            connection.setConnectTimeout(5*1000);

            connection.setReadTimeout(5*1000);

            //与服务器建立连接

            connection.connect();

 

            //服务器响应

            int code = connection.getResponseCode();

 

            if(code == 200){

                InputStream is = connection.getInputStream();

 

                return BitmapFactory.decodeStream(is);

 

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

 

        return null;

    }

}


StreamTools

public class StreamTools {

 

 

    public static String readFromeNetWork(InputStream is){

 

        try {

 

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

 

            byte[] buffer = new byte[1024];

            int len = 0;

            while ((len = is.read(buffer)) != -1){

 

                baos.write(buffer,0,len);

 

            }

            //关闭流

            is.close();

            return baos.toString();

 

 

 

        } catch (Exception e) {

            e.printStackTrace();

        }

 

        return null;

 

    }


}


MyBaseAdapter

public class MyBaseAdapter extends BaseAdapter {

 

    private static final String TAG = "MyBaseAdapter";

    private Context context;

    private List<MenuInfo.ResultBean.DataBean> list;

    //配置图片的缓存选项

    private  DisplayImageOptions options;

    private boolean isScroll = true;

 

    public MyBaseAdapter(Context context, List<MenuInfo.ResultBean.DataBean> list) {

        this.context = context;

        this.list = list;

 

        //配置是否对图片进行缓存

        options = new DisplayImageOptions.Builder()

                .cacheInMemory(true)//是否内存缓存

                .cacheOnDisk(true)//是否sdcard缓存

                .build();//构建图片缓存的选项

 

 

    }

 

    @Override

    public int getCount() {

        return list != null ? list.size() : 0;

    }

 

    @Override

    public Object getItem(int position) {

        return null;

    }

 

    @Override

    public long getItemId(int position) {

        return 0;

    }

 

    /**

     * 加载更多

     */

    public void loadMore(List<MenuInfo.ResultBean.DataBean> lists,boolean isLast) {

 

        for (MenuInfo.ResultBean.DataBean dataBean : lists) {

 

            if(isLast) {

                //添加数据

                list.add(dataBean);

            }else{

                //添加到最前面

                list.add(0,dataBean);

            }

        }

 

    }

    //监听listview是否滚动

    public void isSroll(boolean isScroll){

 

            this.isScroll = isScroll;

 

    }

 

 

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

 

        ViewHolder viewHolder = null;

        if (convertView == null) {

 

            viewHolder = new ViewHolder();

            convertView = convertView.inflate(context, R.layout.item, null);

            viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);

            viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);

 

            convertView.setTag(viewHolder);

 

        }else{

            viewHolder = (ViewHolder) convertView.getTag();

        }

        //设置文本信息

        viewHolder.tvContent.setText(list.get(position).getTags());

        //将图片的uri作为这个图片一个Tag

        viewHolder.ivIcon.setTag(list.get(position).getAlbums().get(0));

        //设置默认的图片  用 setImageResource() 方法替代 setBackgroundResource()

        viewHolder.ivIcon.setImageResource(R.mipmap.ic_launcher);

        //viewHolder.ivIcon.setBackgroundResource(R.mipmap.ic_launcher); 不可以

 

        //使用ImgeLoader加载图片,可以缓存

        //ImageLoader.getInstance().displayImage(list.get(position).getAlbums().get(0),ivIcon,options);

        //ImageLoader.getInstance().displayImage(list.get(position).getAlbums().get(0),ivIcon);

        if(isScroll) {

            loadImage(list.get(position).getAlbums().get(0), viewHolder.ivIcon);

        }

        return convertView;

 

    }

 

    static class ViewHolder{

 

        ImageView ivIcon;

        TextView tvContent;

 

    }

 

 

    //加载图片

    private void loadImage(final String url, final ImageView ivIcon) {

 

        new ImageLoaderAsyncTask(new ImageLoaderAsyncTask.ImageCallBack() {

            @Override

            public void callBack(Bitmap bitmap) {

 

                //ivIcon.setBackgroundResource(R.mipmap.ic_launcher);

                if (bitmap != null) {

                    //拿到服务器获取过来的图片地址与之前你所设置的tag(图片地址)进行比较,如果相同,就是同一张图片

                    if(ivIcon.getTag() != null && url.equals(ivIcon.getTag())) {

                        ivIcon.setTag(url);

                        Log.d(TAG, "url : "+url+"   tag : "+ivIcon.getTag());

                        ivIcon.setImageBitmap(bitmap);

                    }

                } else {

                    Log.e(TAG, "callBack : 加载失败");

                }

 

            }

        }).execute(url);

 

 

    }

 

 

}


MyApplication

public class MyApplication extends Application {

 

    private static final String TAG = "MyApplication";

 

    @Override

    public void onCreate() {

        super.onCreate();

 

        try {

            //缓存路径

            File cacheDir = StorageUtils.getOwnCacheDirectory(this, Environment.getExternalStorageDirectory().getPath());

 

            Log.d(TAG, "onCreate: "+Environment.getExternalStorageDirectory().getPath());

            ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)

                    .threadPoolSize(3)//配置线程数量

                    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))//内存缓存图片 2M

                    .diskCache(new UnlimitedDiskCache(cacheDir))//配饰sdcard缓存路径

                    .diskCacheSize(50 * 1024 * 1024)//sdcard上缓存50M的图片

                    .diskCacheFileCount(100)//缓存文件的数量   100个

                    .diskCacheFileNameGenerator(new Md5FileNameGenerator())

                    .build();

 

            //配置缓存选项

            ImageLoader.getInstance().init(configuration);

        } catch (Exception e) {

            e.printStackTrace();

        }

 

 

    }


}


MainActivity


public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener {

    private XListView lv;

    private ProgressDialog dialog;

    private int pageIndex = 1;

    private MyBaseAdapter adapter;

    //是否上拉

    private boolean isLoadMore = true;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        lv = (XListView) findViewById(R.id.lv);

        //设置是否允许上拉加载更多

        lv.setPullLoadEnable(true);

        lv.setXListViewListener(this);

        lv.setOnScrollListener(new AbsListView.OnScrollListener() {

            @Override

            public void onScrollStateChanged(AbsListView view, int scrollState) {

                switch (scrollState){

                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:

                        if(adapter != null){

                            adapter.isSroll(true);

                        }

                        break;

                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:

                        if(adapter != null){

                            adapter.isSroll(false);

                        }

                        break;

                }

            }

            @Override

            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }

        });

        //设置适配器

        getData("http://apis.juhe.cn/cook/query.php?menu="+

                        URLEncoder.encode("秘制红烧肉")+"&key="+

                        URLEncoder.encode("a7a42220c5c1c5268be7ba25af764f6c")+"&pn="+pageIndex);

    }

    //这是请求菜谱信息操作

    private void getData(String path){

        new AsyncTask<String,Void,String >(){

            @Override

            protected void onPreExecute() {

                super.onPreExecute();

                //执行加载进度框

                dialog = new ProgressDialog(MainActivity.this);

                dialog.setMessage("玩命加载中...");

                dialog.show();

            }

            @Override

            protected void onPostExecute(String s) {

                super.onPostExecute(s);

                //隐藏进度条

                dialog.dismiss();

                if(s != null){

                    Gson gson = new Gson();

                    MenuInfo menuInfo = gson.fromJson(s,MenuInfo.class);

                    //设置数据

                    if(adapter == null) {

                        adapter = new MyBaseAdapter(MainActivity.this, menuInfo.getResult().

                                getData());

                        lv.setAdapter(adapter);

                    }else{

                        adapter.loadMore(menuInfo.getResult().getData(),isLoadMore);

                        //刷新适配器

                        adapter.notifyDataSetChanged();

                    }

                }

            }

            @Override

            protected String doInBackground(String... params) {

                try {

                    String path = params[0];

                    URL url = new URL(path);

                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                    connection.setRequestMethod("GET");

                    connection.setConnectTimeout(5*1000);

                    connection.setReadTimeout(5*1000);

                    //与服务器建立连接

                    connection.connect();

                    //服务器响应

                    int code = connection.getResponseCode();

                    if(code == 200){

                        InputStream is = connection.getInputStream();

                        String str = StreamTools.readFromeNetWork(is);

                        //将网络数据缓存到sdcard /  SQLite  SharedPerfrenced

                        File file = new File(Environment.getExternalStorageDirectory(),"menuinfo.txt");

                        if (!file.exists()){

                            file.createNewFile();

                        }

                        OutputStream os = new FileOutputStream(file);

                        os.write(str.getBytes());

                        //关闭流

                        is.close();

                        os.close();

                       return str;

                    }

                } catch (Exception e) {

                    e.printStackTrace();

                }

                return null;

            }

        }.execute(path);

    }

    @Override

    public void onRefresh() {

            //执行网络请求

        isLoadMore = false;

        ++pageIndex;

        getData("http://apis.juhe.cn/cook/query.php?menu="+

                URLEncoder.encode("秘制红烧肉")+"&key="+

                URLEncoder.encode("a7a42220c5c1c5268be7ba25af764f6c")+"&pn="+pageIndex);

        //停止刷新

        lv.stopRefresh(true);

    }

    @Override

    public void onLoadMore() {

        isLoadMore = true;

        ++pageIndex;

        getData("http://apis.juhe.cn/cook/query.php?menu="+

                URLEncoder.encode("秘制红烧肉")+"&key="+

                URLEncoder.encode("a7a42220c5c1c5268be7ba25af764f6c")+"&pn="+pageIndex);

        //停止显示上拉的V

        lv.stopLoadMore();

    }

}




猜你喜欢

转载自blog.csdn.net/hisunyl/article/details/71141965
今日推荐