1. 程式人生 > >封裝執行緒AsyncTask 網路資料解析和圖片的賦值以及優化

封裝執行緒AsyncTask 網路資料解析和圖片的賦值以及優化

//MainActivity

package com.example.lenovo.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private String UrlStr="http://api.expoon.com/AppNews/getNewsList/type/1/p/1";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = findViewById(R.id.lv);
        final MygsonAdapter adapter = new MygsonAdapter(MainActivity.this);
        listView.setAdapter(adapter);
        GsonUtil.getInstance().getGson(UrlStr, MygsonBean.class, new GsonUtil.GsonCallback<MygsonBean>() {

            @Override
            public void GsonSuccess(MygsonBean mygsonBean) {
                List<MygsonBean.Data> data = mygsonBean.getData();
                adapter.setList(data);
                Log.i("INFO","dad");
            }
        });

    }

}

//介面卡 Adapter

package com.example.lenovo.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
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 com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;

import java.util.ArrayList;
import java.util.List;

class MygsonAdapter extends BaseAdapter {
    private Context context;
    private List<MygsonBean.Data> list;

    public MygsonAdapter(Context context) {
        this.context = context;
        list =new ArrayList<>();
    }

    public void setList(List<MygsonBean.Data> list) {
        this.list = list;
        notifyDataSetChanged();
    }

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

    @Override
    public MygsonBean.Data getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHoder viewHoder;
        if(convertView==null){
            convertView = LayoutInflater.from(context).inflate(R.layout.list,parent,false);
            viewHoder = new ViewHoder();
            viewHoder.textView1 = convertView.findViewById(R.id.t_t1);
            viewHoder.textView2 = convertView.findViewById(R.id.t_t2);
            viewHoder.imageView = convertView.findViewById(R.id.t_image);
            convertView.setTag(viewHoder);
        }else{
            viewHoder = (ViewHoder) convertView.getTag();
        }
        viewHoder.textView1.setText(list.get(position).getNews_title());
        viewHoder.textView2.setText(list.get(position).getNews_summary());
        //繫結
        viewHoder.imageView.setTag(list.get(position).getPic_url());

        //色彩配置 開啟彩色配置
        final DisplayImageOptions options = new DisplayImageOptions.Builder()
                //配置彩色模式
                .bitmapConfig(Bitmap.Config.RGB_565)
                //配置圓形
                .displayer(new CircleBitmapDisplayer())
                //是否快取
                .cacheInMemory(true)
                .displayer(new FadeInBitmapDisplayer(2000))
                .build();
			//使用 ImageLoader需要在全域性配置
			ImageLoader.getInstance().displayImage(getItem(position).getPic_url(),viewHoder.imageView,options);


		//此方法為展示圖片
        /*ImageUtil.getImage(list.get(position).getPic_url(), new ImageUtil.ImageCallback() {
            @Override
            public void onImagesuccess(String imageurl, Bitmap bitmap) {
                if(imageurl.equals(viewHoder.imageView.getTag())){
                    //viewHoder.imageView.setImageBitmap(bitmap);

                }
            }
        });*/

        return convertView;
    }
    class ViewHoder{
        private TextView textView1,textView2;
        private ImageView imageView;
    }
}

//解析資料的封裝類 GsonUtil

這是一個封裝類 裡面有三個方法 外加一個介面 和一個單例
Aysnc 工具類 目的在於封裝了方法 用於外部呼叫來Gson解析資料

package com.example.lenovo.myapplication;

import android.annotation.SuppressLint;
import android.os.AsyncTask;

import com.google.gson.Gson;

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.ProtocolException;
import java.net.URL;

public class GsonUtil  {

    //在本方法定義一個 單例的變數
    private static GsonUtil instance;
    //構造我這個方法 並獲取它的單例
    //當物品定義的單例變數為空是 讓這個方法的單例 = 定義的變數
    public static GsonUtil getInstance(){
        if(instance==null){
            instance = new GsonUtil();
        }
        return instance;
    }


    //05定義 帶有介面的方法 此方法帶有AsyncTask
    @SuppressLint("StaticFieldLeak")
    public  String getGson(final String UrlStr, final Class clazz, final GsonCallback gsonCallback){
        new AsyncTask<String, Void, Object>() {
            @Override
            protected Object doInBackground(String... strings) {
                return getRequest02(UrlStr,clazz);
            }

            @Override
            protected void onPostExecute(Object o) {
                gsonCallback.GsonSuccess(o);
            }
        }.execute(UrlStr);
        return null;
    }

    //04 定義介面
    public interface GsonCallback<M>{
        void GsonSuccess(M m);
    }

    //03 定義自定義class類
    public <E> E getRequest02(String UrlStr,Class clazz){
        return (E) new Gson().fromJson(getRequest01(UrlStr), clazz);
    }
    //01 解析的方法
    public String getRequest01(String UrlStr){
        String result = "";
        try {
            URL url = new URL(UrlStr);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(5000);
            int responseCode = urlConnection.getResponseCode();
            if(responseCode == 200) {
                result = stream2String(urlConnection.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    //02 轉換
    private String stream2String(InputStream is) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) {
            sb.append(tmp);
        }
        return sb.toString();
    }
}

//解析圖片的封裝類 ImageUtil

package com.example.lenovo.myapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class ImageUtil {


    private static ImageUtil instance;
    private static ImageUtil getInstance(){
        if(instance==null){
            instance = new ImageUtil();
        }
        return instance;
    };
    //03
    public static void getImage(final String url, final ImageCallback imageCallback){
        new AsyncTask<String, Void, Bitmap>() {
            @Override
            protected Bitmap doInBackground(String... strings) {
                return getbitmap(strings[0]);
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                imageCallback.onImagesuccess(url,bitmap);
            }
        }.execute(url);
    }

    //02 定義圖片介面 當我這個方法被呼叫的時候回返回給我一個圖片
    public interface ImageCallback{
        void onImagesuccess(String imageurl,Bitmap bitmap);
    }
    //01
    public static Bitmap getbitmap(String UrlStr){
        try {
            URL url = new URL(UrlStr);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(5000);
            urlConnection.setReadTimeout(5000);
            int responseCode = urlConnection.getResponseCode();
            if(responseCode==200){
                return BitmapFactory.decodeStream(urlConnection.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}