Httpurlconnection進行網路請求+ListView
阿新 • • 發佈:2019-01-12
Httpurlconnection進行網路請求+ListView**
- 第一步:找控制元件設定值監聽在MainActivity中
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //第一步:找控制元件設定值監聽 findViewById(R.id.button2).setOnClickListener(this); listView = findViewById(R.id.listView);
2.設定點選事件建立Http以及建立MyAsyncTask類
@Override public void onClick(View v) { switch (v.getId()) { //第二部:點選事件 case R.id.button2: //第三部:建立MyAsyncTask類 //-=============================== Http public static String requestHttpGet(String strUrl) { try { //設定url URL url = new URL(strUrl); //獲取HttpURLConnection HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //設定為get請求 connection.setRequestMethod("GET"); //設定連線主機超時時間 connection.setConnectTimeout(5000); //設定從主機讀取資料超時 connection.setReadTimeout(5000); //獲取請求碼(來判斷網路請求是否正確) int code = connection.getResponseCode(); //判斷請求是否成功 if (code == HttpURLConnection.HTTP_OK) { //如果資料請求成功 //就獲取資料 InputStream stream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "utf-8")); //拼接字串 StringBuilder builder = new StringBuilder(); //把資料讀取從成字串 String str = ""; while ((str = reader.readLine()) != null) { //把一行行資料拼接成一行資料 builder.append(str); } //返回拼接後的資料 return builder.toString(); } //關閉連線 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return null; }
3.MyAsyncTask程式碼如下
public class MyAsyncTask extends AsyncTask< String,Integer,String> { @Override protected String doInBackground(String... strings) { //代表子執行緒 //第五步:利用子執行緒請求資料 return Http.requestHttpGet(strings[0]); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); //主執行緒 //5呼叫 mCallbackS.getData(s); } //第六步:介面回撥=================第七部/:進入MainActivity //1建立介面 public interface CallBackS{ //2抽象方法 void getData(String str); } //3寫個屬性 private CallBackS mCallbackS; //4寫一個set方法 public void setmCallbackS(CallBackS mCallbackS) { this.mCallbackS = mCallbackS; } }
4.點選事件下方寫介面註冊物件實現getData介面
MyAsyncTask task = new MyAsyncTask();
//第九部:6 註冊介面
task.setmCallbackS(MainActivity.this);
//第十步: 請求資料(引數 : 介面 )
task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
//這個時候開始請求資料,資料請求完成後會返回返回到介面回撥的方法中
break;
5.實現介面得到介面回撥返回的資料-
@Override
public void getData(String str) {
//第十一步:實現介面MyAsyncTask.CallBackS ,得到getData方法
//第十二步:得到介面回撥返回的資料-->str
//第十三步:解析
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(str, JsonBean.class);
//獲取集合
ArrayList<JsonBean.DataBean> data = jsonBean.getData();
//第十四步:設定介面卡
listView.setAdapter(new MyAdapter(data, MainActivity.this));
}
介面卡程式碼如下
ublic class MyAdapter extends BaseAdapter {
private ArrayList<JsonBean.DataBean> list;
private Context context;
public MyAdapter(ArrayList<JsonBean.DataBean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = View.inflate(context, R.layout.item, null);
ImageView imageView = convertView.findViewById(R.id.imageView);
TextView textView = convertView.findViewById(R.id.textView);
JsonBean.DataBean datas = list.get(position);
textView.setText(datas.getNews_title());
//第十五步 請求圖片
//請求圖片需要在Application中註冊
///在你自己的專案中 build.gradle( : 你專案的名字)
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//然後新建一個App的類
String uri = datas.getPic_url();
///第十九部:請求圖片(引數:1.圖片介面 ,2 imageview的控制元件)
ImageLoader.getInstance().displayImage(uri, imageView);
//完成
//注意 網路許可權
return convertView;
《**這一部分是優化程式碼,可忽略
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder vh;
if(view==null){
view=LayoutInflater.from(con).inflate(R.layout.item,null);
vh=new ViewHolder();
vh.name=view.findViewById(R.id.name);
vh.img=view.findViewById(R.id.image);
view.setTag(vh);
}else{
vh= (ViewHolder) view.getTag();
}
vh.name.setText(arr.get(i).getNews_title());
//第十五步 請求圖片
//請求圖片需要在Application中註冊
///在你自己的專案中 build.gradle( : 你專案的名字)
// implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
//然後新建一個App的類
String url = arr.get(i).getPic_url();
//第十九部:請求圖片(引數:1.圖片介面 ,2 imageview的控制元件)
ImageLoader.getInstance().displayImage(url,vh.img);
//完成
//注意 網路許可權
return view;
}
static class ViewHolder{
TextView name;
ImageView img;
}
}
}
6.app在下方
package com.qy.day02.app;
import android.app.Application;
import android.graphics.Bitmap;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.qy.day02.R;
//第十六部:建立自己的Application,然後繼承Application
public class App extends Application {
//第十七部:註冊 Application
@Override
public void onCreate() {
super.onCreate();
//第十八部:設定框架的一些屬性,然後初始化 ImageLoader
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 正在載入時顯示的佔位圖
.showImageOnLoading(R.mipmap.zhan)
// // URL為空時顯示的佔位圖
// .showImageForEmptyUri(R.mipmap.zhaobudao)
// 載入失敗時顯示的佔位圖
.showImageOnFail(R.mipmap.shibai)
// //可在實現中對 bitmap 做一些額外處理,比如加圓角、動畫效果。
// .displayer(new SimpleBitmapDisplayer())
// bitmap的質量,預設為ARGB_8888
.bitmapConfig(Bitmap.Config.ARGB_8888)
.build();
//1構建
ImageLoaderConfiguration loaderConfiguration = new ImageLoaderConfiguration.Builder(this)
//把我們寫的設定新增到構建中
.defaultDisplayImageOptions(options)
//構建
.build();
//獲得例項
ImageLoader imageLoader = ImageLoader.getInstance();
//初始化
imageLoader.init(loaderConfiguration);
//初始化完成後進入介面卡載入圖片
}
}
| | |
|--|--|
| | |
提示
要在該專案build.gradle裡後方複製一下程式碼
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
還有App一定要註冊