AsyncTask执行流程及异步请求

1.HttpClient与HttpURLConnection的区别
答:HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。
2.AsyncTask的优缺点
优点:
1.方便实现异步通信,不需使用“任务线程(如继承Thread类)+Handler”的复杂组合
2.节省资源,采用线程池的缓存线程+复用线程,避免了频繁创建&销毁线程所带来的系统资源开销
缺点:
1.AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,而线程池已有128个线程,缓冲队列已满,如果此时向线程提交任务,将会抛出RejectedExecutionException。

3.AsyncTask执行流程
答:1.启动任务执行的输入参数,比如Http请求的URL;
2.后台任务执行的百分比
3.后台执行任务完成后返回的结果,如String,Integer等;
4.同步异步的区别
在共享某一个资源的时候:
同步在发送一个请求,等待返回,然后再发送下一个请求;
异步发送一个请求,不等待返回,随时可以再发送下一个请求;
同步可以避免出现死锁,就是饭只能一口一口吃,只能同时做一个任务,做完之后,才能做其他任务,避免数据混乱,
异步则是可以提高效率了,就是可以同时做多项工作

//主

	public class Frag02 extends Fragment {
    String strURL = "https://www.apiopen.top/novelApi";
    private ListView listView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag02, container, false);
        //第一步:权限
        //第二步: 找控件
        listView = view.findViewById(R.id.listview);

        return view;

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //第九步 开启异步
        MyAsyncTask task = new MyAsyncTask();
        task.execute(strURL);
    }

    //第三步: 创建内部类 继承AsyncTask
    class MyAsyncTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... strings) {
            //第四步:在子线程判断网络
            if (HttpUtil.isNetworkConnected(getActivity())) {
                // 第五步:请求数据
                return HttpUtil.requestString(strings[0]);
            } else {
                //没网返回空字符串
                return "";
            }

        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //第六步:主线程 展示数据
            if (s.equals("")) {
                //没网
                Toast.makeText(getActivity(), "没网!", Toast.LENGTH_LONG).show();
            } else {
                //第七步:有网解析数据 并展示
                //解析
                Gson gson = new Gson();
                JsonBean jsonBean = gson.fromJson(s, JsonBean.class);
                ArrayList<JsonBean.DataBean> list = jsonBean.getData();
                //第八步:展示数据到listview上
                listView.setAdapter(new MyAdapter(list, getActivity()));
            }
        }
    }
}

//HttpUtil

	public class HttpUtil {
	//判断网络状态
    //注意工具类中使用静态方法
    public static boolean isNetworkConnected(Context context) {
        //判断上下文是不是空的
        //为啥要判断啊? 防止context是空的导致 报空指针异常
        if (context != null) {
            //获取连接管理器
            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            //获取网络状态mConnectivityManager.getActiveNetworkInfo();
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();

            if (mNetworkInfo != null) {
                //判断网络是否可用//如果可以用就是 true  不可用就是false
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }

    //=====================================================
    //获取Get请求
    public static String requestString(String strUrl) {
        try {
            //把String 变成URL
            URL url = new URL(strUrl);
            //打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //连接超时时间
            connection.setConnectTimeout(5000);
            //读取超时时间
            connection.setReadTimeout(5000);
            //设置请求方式(要大写)
            connection.setRequestMethod("GET");
            //判断请求码 HttpURLConnection.HTTP_OK
            if (connection.getResponseCode() == 200) {
                //获取输入流(输入=>读,输出=>写)
                //ctrl+alt+V 补全代码
                InputStream stream = connection.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(stream, "utf-8");
                BufferedReader reader = new BufferedReader(inputStreamReader);

                //拼接字符串
                StringBuffer buffer = new StringBuffer();
                String str = "";
                //读取字符串
                while ((str = reader.readLine()) != null) {
                    //拼接字符串
                    buffer.append(str);
                }
                return buffer.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

//Adapter

	package com.qy.glide.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.qy.glide.R;
import com.qy.glide.bean.JsonBean;

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

public 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 dataBean = list.get(position);
        textView.setText(dataBean.getBookname());
        //设置图片
        Glide.with(context).load(dataBean.getBook_cover()).into(imageView);
        return convertView;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43522997/article/details/87438214