封裝執行緒AsyncTask 網路資料解析和圖片的賦值以及優化
阿新 • • 發佈:2018-11-19
//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;
}
}