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;
}
}