android handler

本文介绍了Android中使用Handler进行UI更新的方法。包括在主线程和新线程中使用Handler的不同方式,通过示例代码展示了如何避免ANR问题,并保持UI的实时更新。

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

android提供了handler来处理UI更新的问题

handler有2种处理方式

1.跟主线程在同以线程,可以实现UI更新,但是操作不当也会有ANR问题

2.跟主线程不在同一个线程,新起一个线程。在新的线程中耗时的操作不会有ANR问题

具体代码如下:

package com.stmars.handler;

import com.studymar.radiocheckbox.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class TestHandler extends Activity {
	// 1.声明控件变量
	ProgressBar downBar = null;
	Button sureButton = null;
	Button cancleButton = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.progressxml);
		// 2.获取控件对象
		initElem();
		// 3.设置button监听
		//setlistener();
		 testnewthread();
		Log.i("123", "main thread id=" + Thread.currentThread().getId());
	}

	private void testnewthread() {
		HandlerThread prHandlerThread = new HandlerThread("handlerthread") {
			// 新的线程,耗时操作可以放在里面
			@Override
			public void run() {
				// TODO Auto-generated method stub
				super.run();
			}

		};
		prHandlerThread.start();
		Handler qqHandler = new Handler(prHandlerThread.getLooper()) {
			int i = 0;

			public void handleMessage(Message msg) {
				Log.i("123", "handler thread id="
						+ Thread.currentThread().getId());
				if (i <= 100)
					downBar.setProgress(i);
				else {
					i = 0;
				}
				i = i + 10;
				// progressHandler.sendMessage(msg);
				this.sendEmptyMessage(0);
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			};
		};
		Message msg = qqHandler.obtainMessage();
		msg.sendToTarget();

	}

	class MyHandler extends Handler {
		public MyHandler() {

		}

		public MyHandler(Looper mylooper) {
			super(mylooper);
		}

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
		}

	}

	Handler progressHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			progressHandler.post(r);
		}
	};

	Runnable r = new Runnable() {
		int i = 0;

		@Override
		public void run() {
			// Message msg=progressHandler.obtainMessage();
			if (i <= 100)
				downBar.setProgress(i);
			else {
				i = 0;
			}
			i = i + 10;

			// progressHandler.sendMessage(msg);
			progressHandler.sendEmptyMessage(0);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	};

	private void setlistener() {
		sureButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 4.进度条开始前进
				progressHandler.post(r);
			}
		});
		cancleButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 5.进度条结束
				progressHandler.removeCallbacks(r);
			}
		});
	}

	private void initElem() {
		downBar = (ProgressBar) findViewById(R.id.download);
		sureButton = (Button) findViewById(R.id.sure);
		cancleButton = (Button) findViewById(R.id.cancle);
		downBar.setMax(100);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值