用于调试的静态Toast例程

时间:2017-10-02 18:31:29

标签: android debugging

我正在尝试在没有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被执行。

2 个答案:

答案 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();
}