在安卓中很多时候我们会用到线程 ,举个例子如果说我从界面上获取到值 然后将值传递到接口,然后根据接口返回的东西执行下面的逻辑代码。由于本人的代码是用了很多的Tosat 提醒。所以就选择了Handler 。有时候会出现这种问题,在执行代码的时候因为是用线程去访问接口的 ,所以那个线程会和主线程一起运行。导致那个值是null 所以 第二次运行然后就会有值。所以请看解决方案。
我们可以在外面声明创建一个线程
final Thread thread = new Thread(new Runnable(){
@SuppressWarnings("unchecked")
@Override
public void run() {
try {
Message message = new Message();
message.what = 1;
map=(Map<String, Object>) search(default_code );
System.out.println(map);
handler.sendMessage(message);//当返回值是null的时候就发送消息
System.out.println("发送了消息");
} catch (Throwable e) {
e.printStackTrace();
}
}
});
这个代码块随便放到哪里都行。
然后我们最好在声明一个全局变量的handler,然后在我们需要执行的地方用这个handler将我们需要执行逻辑的代码块包裹住就行。在包裹住之前呢,我们需要执行我们的线程这样样子:
new Thread(thread).start();
这个样子写会少一个线程的异常。之前我在写的时候发觉如果这样去更新,通知handler的话 如果是做一个简单的查询,更新界面,但是如果第二次去查询就会蹦掉出现一个线程的异常好像是不能启动还是什么的。在网上找了很多之后发觉这个样子写可以避免这个错误。
最后我们的代码逻辑部分就是这样子的:
new Thread(thread).start();
handler= new Handler(){
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg.what == 1){
System.out.println("更新后");
//这里写你需要执行的代码块即可
}}};
这样就可以实现这个需求,当然如果数据量很小的话也可以用AsynTask.这个类异步请求。
如果有疑问可以发我的邮件:haiabi@163.com
原文:http://my.oschina.net/wuao/blog/521628