图片框架 三重更新 联网获取json 解析

来源:互联网 发布:iphone6连不上移动数据 编辑:程序博客网 时间:2024/05/16 06:42
import java.security.MessageDigest;/** * Created by HP on 2017/11/7. */public class EncoderUtils {        /**         * Md5Encoder         *         * @param string         * @return         * @throws Exception         */        public static String encode(String string) throws Exception {            byte[] hash = MessageDigest.getInstance("MD5").digest(                    string.getBytes("UTF-8"));            StringBuilder hex = new StringBuilder(hash.length * 2);            for (byte b : hash) {                if ((b & 0xFF) < 0x10) {                    hex.append("0");                }                hex.append(Integer.toHexString(b & 0xFF));            }            return hex.toString();        }    }

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.LruCache;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * Created by HP on 2017/11/7. */public class ImagesUtils {    Handler handler;    private File cacheDir;    private ExecutorService newFixedThreadPool;    private LruCache<String, Bitmap> lruCache;    /**     * @param context     * @param handler     */    public ImagesUtils(Context context, Handler handler) {        //获得你手机上的最大内存        long maxMemory = Runtime.getRuntime().maxMemory();        int maxSize = (int) (maxMemory / 8);        this.handler = handler;        //得到本app在sd上的缓存文件夹        cacheDir = context.getCacheDir();        // 初始化线程池;初始化5个现成,供程序使用        newFixedThreadPool = Executors.newFixedThreadPool(5);        lruCache = new LruCache<String, Bitmap>(maxSize) {            //每次缓存图片都要调用这个方法;            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getRowBytes() * value.getHeight();            }        };    }    /**     * 取图片,     *     * @param path     * @return     */    public Bitmap getBitMap(String path) {        Bitmap bitmap = lruCache.get(path);        if (bitmap != null) {            System.out.println("我走了内存");            return bitmap;        }        //从本直去取,sd卡去取bitmap        bitmap = getBitMapFromLocal(path);        if (bitmap != null) {            System.out.println("我走了本地缓存");            return bitmap;        }       // 从网络去取        getBitmapFromNet(path);        return null;    }    /**     * 从sd卡获取图片     *     * @param path     * @return     */    private Bitmap getBitMapFromLocal(String path) {        try {            String encode = EncoderUtils.encode(path);            FileInputStream fileInputStream = new FileInputStream(cacheDir                    + "/" + encode);            Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);            //存到内存            lruCache.put(path, bitmap);            return bitmap;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 从网络     *     * @param path     */    private void getBitmapFromNet(final String path) {        //用线程池里的线程执行请求网络操作;        newFixedThreadPool.execute(new Runnable() {            @Override            public void run() {                try {                    URL url = new URL(path);                    HttpURLConnection connection = (HttpURLConnection) url                            .openConnection();                    connection.setConnectTimeout(5000);                    connection.setReadTimeout(5000);                    int responseCode = connection.getResponseCode();                    if (responseCode == 200) {                        InputStream inputStream = connection.getInputStream();                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);                        Message msg = new Message();                        msg.what = 111;                        msg.obj = bitmap;                        Bundle data = new Bundle();                        data.putString("tag", path);                        msg.setData(data);                        handler.sendMessage(msg);                        //缓存到本地                        saveBitmapToLocal(bitmap, path);                        //缓存到内存                        lruCache.put(path, bitmap);                    }                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        });    }    protected void saveBitmapToLocal(Bitmap bitmap, String path) {        try {            String encode = EncoderUtils.encode(path);            FileOutputStream fileOutputStream = new FileOutputStream(cacheDir + "/" + encode);            //图片二次裁剪            bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fileOutputStream);        } catch (Exception e) {            e.printStackTrace();        }    }}
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;/** * Created by HP on 2017/11/7. */public class Utils {    public static String getNetString(String str){        try {            URL url=new URL(str);            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();            int responseCode = urlConnection.getResponseCode();            if (responseCode==200){                InputStream is = urlConnection.getInputStream();                BufferedReader br=new BufferedReader(new InputStreamReader(is));                StringBuilder sb=new StringBuilder();                String line=null;                while ((line=br.readLine())!=null){                    sb.append(line);                }                return sb.toString();            }        } catch (MalformedURLException e) {            e.printStackTrace();        }catch (IOException e) {            e.printStackTrace();        }        return null;    }}

import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.graphics.Bitmap;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.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.google.gson.Gson;import com.ljn.myproject.bean.TextBean;import com.ljn.myproject.bean.Utils;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private ListView lv;    ImagesUtils imagUtils;   // ImagesUtils imagUtils;   private String NetString="https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10";    private List<TextBean.NewslistBean> list=new ArrayList<TextBean.NewslistBean>();    private MyAdapter adapter;    private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.what == 0) {                Bitmap bitmap = (Bitmap) msg.obj;                // 设置给imageView                String tag = msg.getData().getString("tag");                // 根据标记取出imageView                ImageView imageView = (ImageView) lv.findViewWithTag(tag);                if (imageView != null && bitmap != null) {                    // 从网络获取图片                    imageView.setImageBitmap(bitmap);                    Log.i("tag", "从网络中获取图片");                }            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);       // imagUtils = new ImagesUtils(this,handler);        imagUtils = new ImagesUtils(this,handler);        lv = (ListView) findViewById(R.id.lv);        new MyAsyncTask().execute(NetString);        adapter = new MyAdapter();        lv.setAdapter(adapter);    }    private class MyAsyncTask extends AsyncTask<String,Void,String> {        @Override        protected String doInBackground(String... strings) {            return Utils.getNetString(strings[0]);        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            Gson gson=new Gson();            TextBean json = gson.fromJson(s, TextBean.class);            List<TextBean.NewslistBean> newslist = json.getNewslist();            list.addAll(newslist);            adapter.notifyDataSetChanged();        }    }    private class MyAdapter extends BaseAdapter {        private ViewHolder vh;        private TextView ctime;        private TextView title;        private TextView description;        private ImageView img;        @Override        public int getCount() {            return list.size();        }        @Override        public Object getItem(int i) {            return null;        }        @Override        public long getItemId(int i) {            return 0;        }        @Override        public View getView(int i, View view, ViewGroup viewGroup) {            if (view==null){                vh = new ViewHolder();                view = View.inflate(MainActivity.this, R.layout.item, null);                view.setTag(vh);            }else{                vh = (ViewHolder) view.getTag();            }            vh.ctime = view.findViewById(R.id.item_ctime);            vh.title = view.findViewById(R.id.item_title);            vh.description = view.findViewById(R.id.item_description);            vh.img = view.findViewById(R.id.item_img);            vh.ctime.setText(list.get(i).getCtime());            vh.title.setText(list.get(i).getTitle());            vh.description.setText(list.get(i).getDescription());            vh.img.setTag(list.get(i).getPicUrl());            //去图片;            Bitmap bitmap = imagUtils.getBitMap(list.get(i).getPicUrl());            // 从内存中或者缓存中            if (bitmap != null) {                vh.img.setImageBitmap(bitmap);            }            return view;        }    }    class ViewHolder{        TextView ctime;        TextView title;        TextView description;        ImageView img;    }}

//activity_main xml文件

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.ljn.myproject.MainActivity">    <ListView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/lv"        ></ListView></android.support.constraint.ConstraintLayout>

//item xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="match_parent">    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="vertical"        >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="1"            android:layout_marginTop="40px"            android:id="@+id/item_description"            />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="2"            android:layout_marginTop="15px"            android:id="@+id/item_title"            />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="3"            android:layout_marginTop="15px"            android:id="@+id/item_ctime"            />    </LinearLayout>    <ImageView        android:layout_width="200px"        android:layout_height="200px"        android:src="@mipmap/ic_launcher"        android:id="@+id/item_img"        /></LinearLayout>
在清单中配置权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>