安卓在子线程中使用使用Toast

今天,在Android子线程想使用Toast进行提示,于是直接在子线程使用
Toast.makeText(getApplicationContext(),"www.lovemu.com.cn",Toast.LENGTH_SHORT);

但是这样会出错,程序会崩溃,

寻找了很多资料,总是不尽如人意。

综合了许多方法,最终得以实现。

新建一个自定义Handler类,【以避免出现This Handler class should be static or leaks might occur 警告】

public class MsgHandler extends Handler {
	private Activity activity;
	public MsgHandler(Activity activity){
		this.activity=new WeakReferenc<Activity>(activity).get();//使用弱引用WeakReferenc,以避免Handler内存泄露
	}
	@Override
	public void handleMessage(Message msg) {

		switch (msg.arg1) {
		case 1:
			showInfo("登录成功!");
			break;
		case 2:
			showInfo("用户名称或者密码错误,请重新输入!");
			break;
		case 3:
			showInfo("如果登录成功,以后账号和密码会自动输入!");
			break;
		case 4:
			showInfo("网络未连接!");
			break;
		case 5:
			showInfo("用户账户是必填项!");
			break;
		case 6:
			showInfo("用户口令是必填项!");
			break;
		default:
			break;
		}
		super.handleMessage(msg);
	}
	
	/**
	 * 显示提示信息
	 * @param info
	 */
	public void showInfo(String info)
	{
		Toast.makeText(activity.getApplicationContext(),info, Toast.LENGTH_SHORT).show();
	}

}

而后,在Login.java代码中使用:

// 实现Handler
private Handler handler;
// 消息
private Message msg;
...
handler = new MsgHandler(Login.this);

在需要使用Toast的线程使用:

msg = handler.obtainMessage();//其中这句与msg.arg1一起使用,以避免再次运行程序时提示msg.arg1定义的值已使用,如This message is already in use.
msg.arg1 = 1;
handler.sendMessage(msg);

使用示例如:

Thread loginThread = new Thread(new Runnable() {
@Override
	public void run() {
		// 执行输入校验
		if (validate()) {
		// 如果登录成功
		if (loginPro()) {
			msg = handler.obtainMessage();
			msg.arg1 = 1;
			handler.sendMessage(msg);
			// 启动Main Activity
			Intent intent = new Intent(Login.this, Main.class);
			startActivity(intent);
			Bundle bundle = new Bundle();
			bundle.putString("MAP_USERNAME", userName);
			intent.putExtras(bundle);
			// 转向登陆后的页面
			startActivity(intent);
		} else {
			proDialog.dismiss();
			msg = handler.obtainMessage();
			msg.arg1 = 2;
			handler.sendMessage(msg);
		}
	}
});
loginThread.start();



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值