今天,在Android子线程想使用Toast进行提示,于是直接在子线程使用
而后,在Login.java代码中使用:
在需要使用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();