一、认识AsyncTask
有需要前往此处了解菜鸟教程AsyncTask
二、实例
要求:通过点击按钮实现加载网络图片
- 先写布局代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_photo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loading"
android:textSize="25dp"
android:layout_alignTop="@id/iv_photo"
/>
<ProgressBar
style="?android:attr/progressBarStyle"
android:id="@+id/bp"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/btn_start"
android:layout_marginTop="183dp"
/>
</RelativeLayout>
- 其次看MainActivity.java
需要注意的地方:
图片地址url需要正确的格式,否则是加载不出来的
如果有小伙伴对 URLConnection网络请求不太了解,可以前往菜鸟教程之URLConnection篇
public class MainActivity extends AppCompatActivity {
//第一步:绑定组件
private ImageView iv_photo;
private ProgressBar progressBar;
private Button btn_start;
/* 声明变量存储要加载的图片地址 */
private String url="http://www.jyumzsf.com/__local/1/25/5E/C93DBDE55A2174761F311A631C3_707A36F6_10642.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_photo=findViewById(R.id.iv_photo);
progressBar=findViewById(R.id.bp);
btn_start=findViewById(R.id.btn_start);
//第二步:设置按钮的点击监听
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//第四步:
/*我们需要先通过调用AsyncTask的execute()方法传入参数并执行任务,调用后就会在
UI线程上执行onPreExecute()方法,该方法是在AsyncTask调用四个方法之前调用-->*/
new MySyncTaskText().execute(url);
}
});
}
//第三步:创建子类MySyncTaskText继承AsyncTask(是一个抽象类),重写其方法
class MySyncTaskText extends AsyncTask<String,Void, Bitmap>{
/**
* 解读AsyncTask参数:
* public abstract class AsyncTask<Params,Progress,Result>{}
* 1、Params表示用于AsyncTask执行任务的参数的类型
* 2、Progress表示在后台线程处理的过程中,以阶段性地发布结果的数据类型
* 3、Result表示任务全部完成后所返回的数据类型TextView String
* **/
//第五步:
//方法一:onPreExecute是一个执行初始化操作,例如:显示条、对话框
@Override
protected void onPreExecute() {
super.onPreExecute();
//设置进度条的可见性
progressBar.setVisibility(View.VISIBLE);
}
//第六步:
//方法二:doInBackground是负责返回任务结果(必须重写,异步执行后台线程将要完成的任务所有耗时操作都这里操作)
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
//创建数组,获取网址的数据,从第0位开始
String url =params[0];
//使用URLConnection连接网络
/**
* 1、定义URL对象,打开连接
* 2、获取字节流(输入流)
* 3、将字节流放入缓冲区(提高加载速度)
* 4、用BitmapFactory.decodeStream();转换成图像
* 5、最后将接口(公共资源)全部关闭
*/
URLConnection connection;
InputStream is;
try {
connection=new URL(url).openConnection();
is=connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bitmap=BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
//第七步:
//方法三:onPostExecute是任务(doInBackground)结束时的操作,功能同onPreExecute是一致
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//设置进度条的显示
progressBar.setVisibility(View.GONE);
//将图像绑定到组件上
iv_photo.setImageBitmap(bitmap);
}
}
}
三、运行结果
出现以下报错:
这是因为我们忘记添加网络权限了,接下来在清单文件中application前面添加网络权限代码:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
再次运行得到我们的想要的结果:
如果对您有帮助,麻烦您点一个小赞给博主。谢谢~
最后附上本次项目源码,免费下载,有需要的小伙伴自取