1: 首先创建Http
public class Http {
public static String requetHttpget(String s){
try {
URL url = new URL(s);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//get请求
connection.setRequestMethod("GET");
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();
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
2:然后是ImageOnLoading
public class imag extends Application {
@Override
public void onCreate() {
super.onCreate();
//设置框架的属性
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher).build();
//构建
ImageLoaderConfiguration loaderConfiguration = new ImageLoaderConfiguration
.Builder(this).build();
//获得实例
ImageLoader imageLoader = ImageLoader.getInstance();
//初始化
imageLoader.init(loaderConfiguration);
}
}
3:构建AsyncTask子类的泛型参数,构建AsyncTask子类的回调方法
构建AsyncTask子类的泛型参数:
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继 承AsyncTask需要指定如下三个泛型参数: Params:启动任务时输入的参数类型. Progress:后台任务执行中返回进度值的类型. Result:后台任务执行完成后返回结果的类型.*
构建AsyncTask子类的回调方法:
AsyncTask主要有如下几个方法:
doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在 此方法中完成.
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并 将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进 度.
**java中交互方式分为两种同步和异步两种,异同情况:
同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个 请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以发送下一个请求。
区别:同步需要等待,异步不需要等待;在项目开发过程中优先选择不需要等待的异步交互。**
public class MyAsyncTask extends AsyncTask<String,Integer,String> {
//子线程
@Override
protected String doInBackground(String... strings) {
//利用子线程请求数据
return Http.requetHttpget(strings[0]);
}
//主线程
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
//调用
callBack.getData(s);
}
//接口
public interface CallBack{
//接口内的抽象方法
void getData(String str);
}
//属性
private CallBack callBack;
//set方法
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
}
4:下一步MainActivity里,Gson解析, 创建对象,注册接口,请求数据
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
//创建对象
MyAsyncTask task = new MyAsyncTask();
//注册接口
task.setCallBack(MainActivity.this);
//请求数据
task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
break;
}
}
记得:implements MyAsyncTask.CallBack(AsyncTask里的interface接口)
@Override
public void getData(String str) {
Gson gson = new Gson();
JsonBean jsonBean = gson.fromJson(str, JsonBean.class);
Toast.makeText(MainActivity.this,""+jsonBean.toString(),Toast.LENGTH_LONG).show();
//获取集合
ArrayList<JsonBean.DataBean> data = jsonBean.getData();
//设置listView适配器
ListAdapter listAdapter = new ListAdter(data,MainActivity.this);
list.setAdapter(listAdapter);
}
5:ListView用于展示解析的数据,外部类
一部分没有优化的重要片段
convertView = View.inflate(context, R.layout.item,null);
ImageView imageView = convertView.findViewById(R.id.imag);
TextView textView = convertView.findViewById(R.id.name);
JsonBean.DataBean dataBean = data.get(position);
textView.setText(dataBean.getNews_title());
String pic_url = dataBean.getPic_url();
ImageLoader.getInstance().displayImage(pic_url,imageView);
return convertView;