Android几种异步的实现

用Java方法来实现异步

主要有两种方法来实现异步,继承Thread类和实现Runnable接口

1、继承Thread类
public class MyThread extends Thread{
	private String str;
	public MyThread(String str){
		this.str= str;
	}
	@Override
	public 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;
	}
	@Override
	public 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(){
	@Override
	public void run(){
		System.out.print("执行耗时或者异步操作");
		runOnUIThread(new Runnable(){
			//此处更新UI
		});
	}
});

使用Android 特有的方法实现异步

1、AsyncTask

实现一个内部类并继承AsyncTask类,并重写方法

public class MainActivity extends Activity{
	private ProgressBar mProgressBar;
	private ImageView mImageView;
	@Override
	public void onCreate(................){
		MyAsyncTask myAsyncTask = new MyAsyncTask();
		myAsyncTask.execute("www.baidu.com/xxx.jpg");
	}
}

class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{
	@Override
	protected void onPreExecture(){
		//这里是开始线程之前执行的,是在UI线程
		mProgressBar.setMax(100);
		super.onPreExecute();
	}
	@Override
	protected 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;
	}
	@Override
	protected void onCancelled(){
		//当任务被取消时回调
		super.onCancelled();
	}
	@Override
	protected void onProgressUpdate(Integer... values){
		super.onP......(values);
		//更新进度
		mProgressBar.setProgress(values[0]);
	}
	@Override
	protected void onPostExecute(Bitmap bitmap){
		super............(bitmap);
		//当任务执行完成时调用,在UI线程
		mImageView.setImageBitmap(bitmap);
	}
}

使用AsyncTask来实现异步简单便携,各个过程都有明确的回调,过程可控,但是缺点就是要是执行多个异步,就会变得很复杂

2、Handler

Handler 用来解决线程间通信,可以在子线程中提醒UI线程更新组件

public class HandlerTextActivity extends Activity{
	Handler mHandler = new Handler(){
		@Override
		public void handleMessage(Message mas){
			switch(mas.what){
				case 0:
					//此处进行UI的更新
					break;
			}
		}
	}
	@Override
	public void onCreate(......................){
		new Thread(new Runnable(){
			//在子线程中执行耗时任务,执行完毕后需要通过 Handler 通知UI线程更新UI
			mHandler.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<String, Bitmap>() {
                    @Override
                    public Bitmap call(String s) {
                        //可以在这里执行耗时操作,比如下载网络图片,然后转化为Bitmap
                        return null;
                    }
                }).subscribeOn(Schedulers.io())//把工作线程指定为了IO线程
                .observeOn(AndroidSchedulers.mainThread())//把回调线程指定为了UI线程
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        //这里是在UI线程,这里显示了图片
                        mImageView.setImageBitmap(bitmap);
                    }
                });
    }
}

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android实现多线程的几种方式有以下几种方法。首先,可以使用Java的Thread类来创建和管理线程。这种方式需要手动创建线程对象,并在run()方法中编写线程的逻辑。其次,可以使用Java的Runnable接口实现多线程。这种方式需要创建一个实现了Runnable接口的类,并将其作为参数传递给Thread类的构造函数。然后,可以使用Handler类来实现多线程。通过Handler的post()或postDelayed()方法,可以将任务添加到主线程的消息队列中,从而在主线程中执行异步操作。此外,还可以使用AsyncTask类来实现多线程。AsyncTask是Android提供的一个封装好的线程池,可以方便地在后台执行耗时操作,并在主线程中更新UI。通过重写AsyncTask的doInBackground()方法来执行耗时操作,并通过onPostExecute()方法来更新UI。需要注意的是,AsyncTask必须在主线程中创建实例,并且execute()方法也必须在主线程中调用。另外,Android 3.0之后,可以使用executeOnExecutor()方法来实现并发执行多个AsyncTask任务。总结起来,Android实现多线程的几种方式包括使用Thread类、Runnable接口、Handler类和AsyncTask类。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Android——多线程的多种实现方式](https://blog.csdn.net/abliudede/article/details/104891324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android开发中四种常用的多线程实现方式](https://blog.csdn.net/star_nwe/article/details/130140238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值