接触Android开发两个月,最近困扰在线程的中断上,在网上也没找到傻瓜式的方法(高深的看不懂),
现走了条野路子,至少把我遇到的问题解决了。第一次写博客,希望大家给予支持,忠心接受大家的狂喷!
1. Activity中 用Map记录 key:线程ID 与 value:线程状态(判断线程回调后是否还要执行相关代码)
2. 在自定义线程(MyThread)内设置方法获取所需属性:setProperty(...)
我没用线程的构造函数,因为我只能在new出线程对象后 获取到ID
3. 线程回调到handle中后,判断对应ID的状态(true:执行, false:不执行)
4. 在想中断线程地方,将对应的ID状态改成false(我是在切换画页时想中断所有存入Map的线程)
这样就出现了线程中断的假象
// 线程类
public class MyThread extends Thread {
private Long id;
private Handler handler;
public void setProperty(Long id, Handler handler) {
this.id = id;
this.handler = handler;
}
@Override
public void run() {
Message msg = handler.obtainMessage();
...
map.put("id", id);
msg.obj = map;
msg.what = 1;
handler.sendMessage(msg);
}
}
// 主画页
class MainActivity extends Activity {
private Handler handler;
// 记录线程状态
protected Map<Long, Boolean> mapList;
@Override
protected void onCreate(Bundle savedInstanceState) {
MyThread thread = new MyThread();
thread.setProperty(thread.getId(), handler);
thread.start();
}
@Override
protected void onStop() {
// 画页迁移走 所有线程状态变成false
Iterator iter = mapList.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
mapList.put((Long)entry.getKey(), false);
}
super.onStop();
}
public class myHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
if (null == mapList){
break;
}
Map<String, Object> map = (Map<String, Object>) msg.obj;
Long id = (Long) map.get("id");
// 判断线程状态,如果画页迁移走,对应的所有开启的线程状态都变成false
// 这样就会出现线程中断的假象,
if (mapList.get(id)) {
...
}
break;
default:
break;
}
super.handleMessage(msg);
}
}
}