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

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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值