1. 程式人生 > >Httpurlconnection進行網路請求+ListView

Httpurlconnection進行網路請求+ListView

Httpurlconnection進行網路請求+ListView**

  1. 第一步:找控制元件設定值監聽在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一定要註冊