静态方法调用Toast.makeText

Eri*_*Lin 5 android

我有一个在C++中运行的线程,当某些条件满足时,它将调用我的UI线程(Java)静态方法.调用静态方法时,我希望在我的UI上显示Toast.我试过的是:

1

     static void myMethod(){
        Toast.makeText(context, "message", Toast.LENGTH_SHORT).show();
        (I have a static context reference in global scope)
     }
Run Code Online (Sandbox Code Playgroud)

结果:

     E/AndroidRuntime( 1331): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Run Code Online (Sandbox Code Playgroud)

2

     static void myMethod(){
         runOnUiThread(new Runnable(){
             public void run(){
                Toast.makeText(Context, "message", Toast.LENGTH_SHORT).show();
             }
         });
Run Code Online (Sandbox Code Playgroud)

结果:

   Can not compile: Cannot make a static reference to the non-static method runOnUiThread(Runnable) from the type Activity
Run Code Online (Sandbox Code Playgroud)

有人可以对此有所了解吗?非常感谢你.

Dan*_*vak 7

我认为你从与UI线程不同的线程调用此方法,这会导致异常.我刚试过在我的Application类中声明一个静态方法,它会像你的第一个代码一样.它工作 - 但当然只有从主UI线程调用时.

如果您希望能够从其他线程调用静态方法,则需要在UI线程上创建一个处理程序以显示Toast.像这样的东西:

private static final int MSG_SHOW_TOAST = 1;

private static Handler messageHandler = new Handler() {
       public void handleMessage(android.os.Message msg) {
           if (msg.what == MSG_SHOW_TOAST) {
               String message = (String)msg.obj;
               Toast.makeText(App.this, message , Toast.LENGTH_SHORT).show();
           }
       }
};

private static void displayMessage() {
   Message msg = new Message();
   msg.what = MSG_SHOW_TOAST;
   msg.obj = "Message to show";
   messageHandler.sendMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)

我的示例中的上下文是从App.this中检索的,它是Application类.您可以将其替换为您的Activity或静态全局上下文.

  • 我得到一个"没有封闭的Application类型的实例可以在范围内访问"编译错误. (2认同)

小智 5

static Activity thisActivity = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    thisActivity = this;    
}

public static void showMsg()
{       
  Toast.makeText(thisActivity, "message" , Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)