handle 关于static or leaks might occur的warning

从发现这个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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值