静态方法调用Toast.makeText

时间:2011-09-21 08:13:01

标签: 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)
     }

结果:

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

2

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

结果:

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

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

4 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

请尝试此操作,如this帖子中所述:

public class SampleActivity extends Activity {

  /**
   * Instances of static inner classes do not hold an implicit
   * reference to their outer class.
   */
  private static class MyHandler extends Handler {
    private final WeakReference<SampleActivity> mActivity;

    public MyHandler(SampleActivity activity) {
      mActivity = new WeakReference<SampleActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
      SampleActivity activity = mActivity.get();
      if (activity != null) {
        // ...
      }
    }
  }

  private final MyHandler mHandler = new MyHandler(this);

  /**
   * Instances of anonymous classes do not hold an implicit
   * reference to their outer class when they are "static".
   */
  private static final Runnable sRunnable = new Runnable() {
      @Override
      public void run() { }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Post a message and delay its execution for 10 minutes.
    mHandler.postDelayed(sRunnable, 600000);

    // Go back to the previous Activity.
    finish();
  }
}

答案 3 :(得分:0)

我不得不使用稍微不同的方法来获取上下文。

以前创建的全局Application类:

package com.com.YourAppName;

import android.app.Application;

public class YourAppName_app extends Application {

    //declarations, getters, setters, etc...
}

您想要Toast的Activity / FragmentActivity中的静态方法:

public class Home extends FragmentActivity {

static YourAppName_app app;

private static void yourStaticMethod() {

    app = ((YourAppName_app)getApplicationContext()); //can also call this in onCreate 
    Toast.makeText(app, "Your Toast message", Toast.LENGTH_LONG)
                .show();
}