首先给大家看一下效果:
这是有网的状态
这是没有网络的状态
好了,代码如下:
MainActivity里面的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, MyAsyncTask.CallBacks {
private Button btn;
private ListView listv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第一步:找控件设置监听
btn = findViewById(R.id.btn);
listv = findViewById(R.id.list);
btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
//第二步:点击事件
case R.id.btn:
//第三步 创建MyAsyncTask类
//-------------------------------
//第八步创建MyAsyncTask对象
MyAsyncTask task=new MyAsyncTask();
//第九步:注册接口
task.setCal(MainActivity.this);
//第十步:请求数据(参数:接口)
task.execute("http://api.expoon.com/AppNews/getNewsList/type/1/p/1");
//这个时候开始请求数据,数据请求完成后会返回返回到接口回调的方法中
break;
}
}
@Override
public void getData(String st) {
//第十一步:实现接口MyAsyncTask.CallBackS ,得到getData方法
//第十二步:得到接口回调返回的数据-->str
//第十三步:解析
Gson gson=new Gson();
JsonBean bean = gson.fromJson(st, JsonBean.class);
//获取集合
ArrayList<Datas> data = bean.getData();
//第十四步:设置适配器
listv.setAdapter(new MyAdapter(MainActivity.this,data));
}
}
Http文件夹下面的http代码:
public class Http {
/**
* 请求数据GET请求
*/
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();
//判断请求是否成功
//请求码200相等于 HttpURLConnection.HTTP_OK
if(code==200){
//如果数据请求成功
//就获取数据
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;
}
}
Http文件夹下面的MyAsyncTask代码
//第一个泛型 代表你要给子线程传的东西
//第二个泛型 代表任务执行的进度 用Integer
//第三个泛型 代表解析完成后子线程返回的值,以及主线程接受的值
//===================================
///第四:继承AsyncTask,然后写三个泛型,< String,Integer,String>
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调用
cal.getData(s);
}
//第六步:接口回调=================第七部/:进入MainActivity
//1创建接口
public interface CallBacks{
//2抽象方法
void getData(String st);
}
//3写个属性
private CallBacks cal;
//4写一个set方法
public void setCal(CallBacks cal) {
this.cal = cal;
}
}
app文件夹下的App代码:
//第十六部:创建自己的Application,然后继承Application
public class App extends Application {
//第十七部:注册 Application
@Override
public void onCreate() {
super.onCreate();
//第十八部:设置框架的一些属性,然后初始化 ImageLoader
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 正在加载时显示的占位图
.showImageOnLoading(R.mipmap.zhan)
// 加载失败时显示的占位图
.showImageOnFail(R.mipmap.shibai)
// 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);
//初始化完成后进入适配器加载图片
}
}
适配器(adapter)的代码:
public class MyAdapter extends BaseAdapter {
private Context con;
private ArrayList<Datas> arr;
public MyAdapter(Context con, ArrayList<Datas> arr) {
this.con = con;
this.arr = arr;
}
@Override
public int getCount() {
return arr.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
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;
}
}
注意,注意, 权限 权限不写上的话 运行不出来
AndroidManifest.xml里面注册一个网络权限
<uses-permission android:name="android.permission.INTERNET" />
里面还要注册一个 就是在application里面写一个android:name=".app.App"
图片要放在res/mipmap-hdpi里面
还有最重要一步:在Gradle Scripts里面找到自己的项目 例如:build.gradle(Module:day02)然后点击之后把
implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
复制进去就OK了