详解Android中多线程中UI操作

本文详细介绍了在Android中,由于系统不支持在多线程中直接操作UI,因此提出了三种异步任务机制:runOnUiThread、Handler和AsyncTask。通过实例展示了如何在多线程环境下正确更新用户界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android中不支持在多线程中操作UI,所Adroid提供了三种异步任务机制,runOnUiThread,Handler和AsyncTask。

下面 是一个完整例子:

public class MainActivity extends Activity {

	protected static final int thread_quest = 0;
	ImageButton btn;
	ImageView iv ;
	ProgressBar pb;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView)findViewById(R.id.image1);
		iv.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.bluetooth));
		pb = (ProgressBar)findViewById(R.id.progressBar1);
		this.initbtn();		
	}

	private Handler handle = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			if(msg.what == thread_quest)
			{
				iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icone_windows));
				//iv.setImageBitmap(BitmapFactory.decodeFile("e:\\Sun.png"));
			}
			
			super.handleMessage(msg);
		}
		
	};
	private Thread th = new Thread(new Runnable(){

		@Override
		public void run() {
			
		//iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wm));//错误操作
		}
		
	});
	private void  initbtn()
	{
		findViewById(R.id.button2).setOnClickListener(new OnClickListener(){//使用AsyncTask处理异步UI操作
		@Override
		public void onClick(View v) {
			Progress pg = new Progress();
			pg.execute();
		}
		
		
	});
		findViewById(R.id.button1).setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {

				new Thread(new Runnable(){

					@Override
					public void run() {
						runOnUiThread(new Runnable(){
							@Override
							public void run() {
								iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.sun));}
							});
						
					}
					
				}).start();
			}
			
		});
		if(btn==null)
		{
			btn = (ImageButton)findViewById(R.id.imageButton1);
			btn.setOnClickListener(new OnClickListener(){

				@Override
				public void onClick(View v) {				
					new Thread(new Runnable(){					
						@Override
						public void run() {
							Message msg = new Message();
							msg.what = MainActivity.thread_quest;
							handle.sendMessage(msg);
							//iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icone_windows));
						}
						
					}).start();
				}			
			});
		}
	}
	
	//定义一个内部类
	public class Progress extends AsyncTask<Void, Integer, Boolean> {

		private int progress=10;
		@Override
		protected Boolean doInBackground(Void... params) {
			while(progress<100)
			{
				progress = (progress+2)%100;			
				try {
						Thread.sleep(50);
					this.publishProgress(progress);
				} catch (InterruptedException e) {
					e.printStackTrace();}
			}
			return null;
		}
		@Override
		protected void onPreExecute() {
			pb.setProgress(progress);
			super.onPreExecute();
		}

		@Override
		protected void onPostExecute(Boolean result) {
			Toast.makeText(MainActivity.this, "AsyncTask执行完毕", Toast.LENGTH_SHORT);
			super.onPostExecute(result);
		}
		@Override
		protected void onProgressUpdate(Integer... values) {
			pb.setProgress(progress);
			super.onProgressUpdate(values);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值