利用AsncTask可以实现异步任务
问题引入:
Android是单线程模型,要把耗时操作放到非主线程中执行
线程,线程池可以来实现,现用一个封装好的异步操作AsyncTask来简化实现异步任务。
使用方法
- 子类参数(泛型):
- Params:启动任务时输入的参数类型
- Progress:后台执行过程中返回进度值的类型
- Result:后台执行完成后返返回的结果类型
回调方法
- doInbackground:后台执行的任务,必须重写
- onPreExecute: 后台任务执行前,执行的任务,如,初始化
- onPostExecute: 后台执行后,自动执行的方法。并把后台的值返回与此
- onProgressUpdate: 在doInBackGround()方法中调用publishprogress(),更新任务的执行进度
方法的使用顺序
onPreExecute–doInBackGround(onProgressUpdate)–onPostExecute- 重写AsyncTask–MainActivity:MyAsyncTask task=new MyAsyncTask();–task.execute();
案例学习
加载网络图片
异步任务中下载图片,主UI线程中设置图片
- Image.xml—progressbar(visibility:gone)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/im"/>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:id="@+id/pb"/>
</LinearLayout>
- Image.java -extends Activity{
onCreate(声明控件,设置URL);
public class Image extends Activity {
private ImageView mImage;
private ProgressBar mProgressBar;
//存入网络图片的地址链接
private String URL=
"http://orfjxkwsz.bkt.clouddn.com/u=3264068453,1678066233&fm=26&gp=0.jpg";
@Override
//补充onCreate方法 设置image.xml视图
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image);
mImage=(ImageView)findViewById(R.id.im);
mProgressBar= (ProgressBar) findViewById(R.id.pb);
//在此使用MyAsyncTask
new Image.MyAsyncTask().execute(URL);
}
—-内部类MyAsyncTask extends AysncTask;—加载}
//参数传入数值类型(URL),进度值类型,返回值类型(图片)
class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressBar.setVisibility(View.VISIBLE);//
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
mProgressBar.setVisibility(View.GONE);
mImage.setImageBitmap(bitmap);
}
}
}
- doInBackGround()从params中获取传递进来的参数–decodeStream方法解析输入流–将bitmap返回
@Override
//访问网络加载图片,后台操作,参数分别是传入的param数组
protected Bitmap doInBackground(String... params) {
String url=params[0];//只传入了一个参数,即为第零位
Bitmap bitmap=null;//需要获取的图片对象
URLConnection connection;//访问网络
InputStream is;//输入数据
//导入URL包
try {
connection=new URL(url).openConnection();
is=connection.getInputStream();//获取输入流
BufferedInputStream bis=new BufferedInputStream(is);
bitmap= BitmapFactory.decodeStream(bis);
is.close();
bis.close();
Thread.sleep(1000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return bitmap;
}
- new Image.MyAsyncTask().execute(URL);//在image.java–Oncreate中
- Manifest.xml中加入
<uses-permission android:name="android.permission.INTERNET"/>
<activity android:name=".Image"/>
异步效果
大佬安利—— 贝塞尔曲线布局
大佬的链接
compile ‘com.flyingstudio:bezierrefresh:1.0.1’
app:bezierBackground="@color/colorAccent"
app:bezierHeight="300dp"
app:refreshIcon="@mipmap/blank"
bezierScrollLayout.setScrollListener(new OnScrollListener() {...}
bezierScrollLayout.setRefreshing(false);
volley加载图片
RequestQueue queue=Volley.newRequestQueue(MainActivity.this);
//(String url, Listener<Bitmap> listener, int maxWidth,
// int maxHeight, Config decodeConfig, ErrorListener errorListener)
ImageRequest imageRequest=new ImageRequest("http://orfjxkwsz.bkt.clouddn.com/avatar.png"
, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
queue.add(imageRequest);}