异步任务AsyncTask

利用AsncTask可以实现异步任务

问题引入:

Android是单线程模型,要把耗时操作放到非主线程中执行
线程,线程池可以来实现,现用一个封装好的异步操作AsyncTask来简化实现异步任务。

使用方法

  1. 子类参数(泛型):
    • Params:启动任务时输入的参数类型
    • Progress:后台执行过程中返回进度值的类型
    • Result:后台执行完成后返返回的结果类型
  2. 回调方法

    • doInbackground:后台执行的任务,必须重写
    • onPreExecute: 后台任务执行前,执行的任务,如,初始化
    • onPostExecute: 后台执行后,自动执行的方法。并把后台的值返回与此
    • onProgressUpdate: 在doInBackGround()方法中调用publishprogress(),更新任务的执行进度
  3. 方法的使用顺序
    onPreExecute–doInBackGround(onProgressUpdate)–onPostExecute

  4. 重写AsyncTask–MainActivity:MyAsyncTask task=new MyAsyncTask();–task.execute();

案例学习

加载网络图片

异步任务中下载图片,主UI线程中设置图片
- Image.xml—progressbar(visibility:gone)

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/im"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:id="@+id/pb"/>
  • 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 listener, int maxWidth,
                // int maxHeight, Config decodeConfig, ErrorListener errorListener)
                ImageRequest imageRequest=new ImageRequest("http://orfjxkwsz.bkt.clouddn.com/avatar.png"
                        , new Response.Listener() {
                    @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);}

效果图

你可能感兴趣的:(Android,android,asynctask,异步)