is your activity running?

wymaweiyue 2015-07-07 02:28:23
程序报如下异常:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41a068c8 is not valid; is your activity running?

程序结构如下:
class ParentActivity extends Activity{
.......
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while (!isInterrupted()) {
......
try {
onDataReceived(buffer, size);
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}

protected abstract void onDataReceived(final byte[] buffer, final int size);

protected void DisplayError(int resourceId, Activity activity) {
AlertDialog.Builder b = new AlertDialog.Builder(activity);
b.setTitle("Error");
b.setMessage(resourceId);
b.setPositiveButton("OK", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//SerialPortActivity.this.finish();
}
});
b.show();
}
}

class SubA extends ParentActivity {
@Override
protected void onDataReceived(byte[] buffer, int size) {
....
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
}

private Handler mHandler = new Handler() {
@Override
public synchronized void handleMessage(Message msg) {
switch (msg.what) {
case 1: {
DisplayError(R.string.error_op, TagFunctionActivity.this);
break;
}
case 2: {
DisplayError(R.string.success_op, TagFunctionActivity.this);
break;
}
}
}
};
}

class SubB extends ParentActivity {
@Override
protected void onDataReceived(byte[] buffer, int size) {
....
Message msg = mHandler.obtainMessage();
msg.what = 1;
mHandler.sendMessage(msg);
}

private Handler mHandler = new Handler() {
@Override
public synchronized void handleMessage(Message msg) {
switch (msg.what) {
case 1: {
......
}
}
}
};
}


操作流程如下:
1、SubA有个按钮,点击后启动父类中的线程ReadThread ,然后再回调本类中的onDataReceived()方法做一些事情。
2、SubB中也有个按钮,点击后启动父类中的线程ReadThread ,然后再回调本类中的onDataReceived()方法做一些事情。

问题如下:
首先进入SubA,点击按钮,执行到SubA的onDataReceived()方法,并通过Handler弹出提示消息(调用DisplayError(R.string.error_op, SubA.this)方法)。然后返回主界面,再进入SubB界面。
进入SubB界面,点击按钮,此时会发现时SubB的onDataReceived()方法和SubA的onDataReceived()都会执行,此时SubA中再去通过Handler弹出提示消息框就报错了。

如果SubA中不弹出消息提示框(不调用DisplayError(R.string.error_op, SubA.this)方法),则在SubB界面中不会报错。

本人菜鸟,百度也没能百度出个名目来,望各路大侠指教。
...全文
123 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hare_ 2015-07-07
  • 打赏
  • 举报
回复
显示对话框之前检测,对话框依附的Activity是否已经finish

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧