Android几种异步的实现
16lz
2021-01-23
文章目录
- 用Java方法来实现异步
- 1、继承Thread类
- 2、实现Runnable接口
- 使用Android 特有的方法实现异步
- 1、AsyncTask
- 2、Handler
- 3、RxJava
用Java方法来实现异步
主要有两种方法来实现异步,继承Thread类和实现Runnable接口
1、继承Thread类
public class MyThread extends Thread{private String str;public MyThread(String str){this.str= str;}@Overridepublic void run(){System.out.println(str);runOnUIThread(new Runnable() { //此处更新UI});}}public class MainText{public static void main(String[] args){MyThread thread1= new MyThread("myThread1");MyThread thread2= new MyThread("myThread2");MyThread thread3= new MyThread("myThread3");thread1.start();thread2.start();thread3.start();}}
2、实现Runnable接口
public class MyThreadRunnable implements Runnable{private String str;public MyThreadRunnable(String str){this.str = str;}@Overridepublic void run(){System.out.print(str);runOnUIThread(new Runnable(){//此处更新UI}}}public class MainTest{public static void main(String[] args){MyThreadRunnable thread1 = new MyThreadRunnable("runnable1");MyThreadRunnable thread2 = new MyThreadRunnable("runnable2");Thread t1 = new Thread(thread1);Thread t2 = new Thread(thread2);t1.start();t2.start();}}//或者直接 使用内部类:new Thread(new Runnable(){@Overridepublic void run(){System.out.print("执行耗时或者异步操作");runOnUIThread(new Runnable(){//此处更新UI});}});
使用Android 特有的方法实现异步
1、AsyncTask
实现一个内部类并继承AsyncTask类,并重写方法
public class MainActivity extends Activity{private ProgressBar mProgressBar;private ImageView mImageView;@Overridepublic void onCreate(................){MyAsyncTask myAsyncTask = new MyAsyncTask();myAsyncTask.execute("www.baidu.com/xxx.jpg");}}class MyAsyncTask extends AsyncTask{@Overrideprotected void onPreExecture(){//这里是开始线程之前执行的,是在UI线程mProgressBar.setMax(100);super.onPreExecute();}@Overrideprotected Bitmap doInBackground(String... params){//这是在后台子线程中执行的Bitmap bitmap = null;try{URL url = new URL(params[0]);HttpURLConnection connection = (HttpURLConnection) url.openConnection();InputStream stream = connection.getInputStream();bitmap = BitmapFactory.decodeStream(inputStrem);publishProgress(70); //这里是更新进度inputStream.close();}catch(Exception e){e.printStackTrace();}return bitmap;}@Overrideprotected void onCancelled(){//当任务被取消时回调super.onCancelled();}@Overrideprotected void onProgressUpdate(Integer... values){super.onP......(values);//更新进度mProgressBar.setProgress(values[0]);}@Overrideprotected void onPostExecute(Bitmap bitmap){super............(bitmap);//当任务执行完成时调用,在UI线程mImageView.setImageBitmap(bitmap);}}
使用AsyncTask来实现异步简单便携,各个过程都有明确的回调,过程可控,但是缺点就是要是执行多个异步,就会变得很复杂
2、Handler
Handler 用来解决线程间通信,可以在子线程中提醒UI线程更新组件
public class HandlerTextActivity extends Activity{Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message mas){switch(mas.what){case 0://此处进行UI的更新break;}}}@Overridepublic void onCreate(......................){new Thread(new Runnable(){//在子线程中执行耗时任务,执行完毕后需要通过 Handler 通知UI线程更新UImHandler.sendEmptyMessage(0);}).start();}}
主线程也可以发消息给子线程:
public class LooperThreadActivity extends Activity { private Handler mHandler = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new MyThread().start(); //发消息到目标子线程 mHandler.obtainMessage(0).sendToTarget(); } class MyThread extends Thread{ @Override public void run() { super.run(); //1.建立消息循环,初始化Looper Looper.prepare(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; if(what == 0){ // } } }; //启动消息循环 Looper.loop(); } }}
3、RxJava
public class RxJavaTestActivity extends Activity { private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Observable.just("") .map(new Func1() { @Override public Bitmap call(String s) { //可以在这里执行耗时操作,比如下载网络图片,然后转化为Bitmap return null; } }).subscribeOn(Schedulers.io())//把工作线程指定为了IO线程 .observeOn(AndroidSchedulers.mainThread())//把回调线程指定为了UI线程 .subscribe(new Action1() { @Override public void call(Bitmap bitmap) { //这里是在UI线程,这里显示了图片 mImageView.setImageBitmap(bitmap); } }); }}
更多相关文章
- Android为什么会有65536的方法数量限制
- Android Studio ——Android 使用Pull方法解析XML文件的方法
- Android 学习系列 - 线程模型
- 记录关于Gradle : Build Running的解决方法
- Android 开机震动的调用位置以及打开关闭方法
- Android中计算text文字大小的几个方法
- Android的DialogFragment的基本使用方法