我正在尝试在没有Android Studio的ADB(Android调试桥)驱动程序的模糊Android设备上调试某些代码,因此我无法使用Android Studio调试器在设备上单步操作,因此我正在调试盲目。
所以我想我会使用一种老式的“printf”策略,在我需要它们的代码中插入带有各种调试信息的小型Android吐司。我称之为的一些代码是静态的,有些则不是。
我做了一个“吐司”常规
// make a Toast I can use for debugging
private static void makeToast(String msg) {
Toast toast = Toast.makeText(thisActivity, msg, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 200); // x offset , y offset
toast.show();
}
因此声明了“this”活动:
private static PlyListActivity thisActivity = null;
并在OnCreate初始化......
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//We need another instance to avoid a static reference
selBox = new SelBoxListener(); //was final SelBoxListener
RemoteControlActivity.curContext = this;
thisActivity = this;
. . .
这是一个被调用的例子。 。 。
public static void updateBillboard(final int resColor, final String imsg2) {
//Are we created yet?
if (plyBillboard != null) {
plyBillboard.post(new Runnable() {
public void run() {
plyBillboard.setTextColor(resColor);
plyBillboard.setText(imsg2);
}
});
} //fi
//!! thisActivity.finish();
makeToast("in UpdateBillboard");
}
没有吐司弹出。如果我取消注释掉 finish()的调用,它将退出Activity,从而确认我正在执行代码。 。 。
那么我做错了什么以及如何让我的祝酒词出现呢?
编辑:一个响应者建议我需要将调用放在runnable中的 makeToast()中,以便调用它。但这就是为什么我注意到如果我取消注释 finish()的调用,它会导致Activity退出。实际上,如果我在 makeToast()中调用 finish(),它会做同样的事情,因此调用 makeToast() IS被执行。
答案 0 :(得分:2)
当你看看Runnable的定义时“ 当使用实现接口Runnable的对象来创建线程时,启动该线程会导致在该单独执行的线程中调用该对象的run方法。“
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Log.d("Thread", "I am on UI thread");
showToastHere();
}
});
答案 1 :(得分:1)
我的猜测是方法updateBillboard没有在UI线程中运行,因此使其工作的一种方法是使用Handler。例如:
private static Handler mHandler;
@Override
onCreate(Bundle...) {
super.onCreate(...);
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message inputMessage) {
String message = (String) inputMessage.obj;
makeToast(message);
}
}
}
updateBillboard(...) {
...
Message message = mHandler.obtainMessage(0, "Hello");
message.sendToTarget();
}