从发现这个warning后到网上搜索,无外乎那几种答案。最常用的就是通过弱引用的方式来做。定义一个静态的内部类,然后让它持有Activity的弱引用
static class MyHandler extends Handler
{
WeakReference<PopupActivity> mActivity;
MyHandler(PopupActivity activity)
{
mActivity = new WeakReference<PopupActivity>(activity);
}
@Override
public void handleMessage(Message msg)
{
PopupActivity theActivity = mActivity.get();
switch (msg.what)
{
case 0:
theActivity.popPlay.setChecked(true);
break;
}
}
};
MyHandler ttsHandler = new MyHandler(this);
private Cursor mCursor;
private void test()
{
ttsHandler.sendEmptyMessage(0);
}
http://www.cnblogs.com/jevan/p/3168828.html
http://www.xuebuyuan.com/1981620.html
但这样做是有问题的:如果MyHandle类中有非静态成员,那么整个程序就会崩掉。
所以我采用了另一种方法:在new Handle 的时候传入一个Callback就可以避开handleMessage不好写的问题了。
那么何为Callback呢? 我又找到一个好理解的解释:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
参考文章:
http://www.zhihu.com/question/19801131
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=535709&page=1#pid4171451
下面是Callback 的列子:
普通的计算函数执行时间:
public class TestObject {
/**
* 一个用来被测试的方法,进行了一个比较耗时的循环
*/
public static void testMethod(){
for ( int i= 0 ; i< 100000000 ; i++){
}
}
/**
* 一个简单的测试方法执行时间的方法
*/
public void testTime(){
long begin = System.currentTimeMillis(); //测试起始时间
testMethod(); //测试方法
long end = System.currentTimeMillis(); //测试结束时间
System.out.println("[use time]:" + (end - begin)); //打印使用时间
}
public static void main(String[] args) {
TestObject test=new TestObject();
test.testTime();
}
}
用了callback以后:
public class Tools {
/**
* 测试函数使用时间,通过定义CallBack接口的execute方法
* @param callBack
*/
public void testTime(CallBack callBack) {
long begin = System.currentTimeMillis(); //测试起始时间
callBack.execute(); ///进行回调操作
long end = System.currentTimeMillis(); //测试结束时间
System.out.println("[use time]:" + (end - begin)); //打印使用时间
}
public static void main(String[] args) {
Tools tool = new Tools();
tool.testTime(new CallBack(){
//定义execute方法
public void execute(){
//这里可以加放一个或多个要测试运行时间的方法
TestObject.testMethod();
}
});
}
}
当然还有一个 CallBack接口,里面有一个函数execute();
参考文章:http://blog.csdn.net/very_caiing/article/details/41928263
于是我就将程序里改为:
handler = new Handler(new Callback()
{
@Override
public boolean handleMessage(Message msg)
{
switch (msg.what)
{
case 0:
mDialog.cancel();
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
LoginActivity.this.finish();
break;
case 1:
mDialog.cancel();
Toast.makeText(getApplicationContext(), "密码错误",
Toast.LENGTH_SHORT).show();
break;
case 2:
mDialog.cancel();
// Toast.makeText(getApplicationContext(), "URL验证失败",
// Toast.LENGTH_SHORT).show();
Intent intent1 = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent1);
LoginActivity.this.finish();
Log.e("---------", "到这一步了");
break;
default:
break;
}
return true;
}
});
检测后程序是可以正常运行的,但不知道逻辑上有没有什么错误。
以上就是我两小时干的事了。
2015.5.17