0

我想在非 Activity 类的静态方法中启动 toast 消息。我读了很多关于这个的帖子,但我的情况有点复杂,特别是:

我有一个服务,在 OnStartCommand 中我以固定间隔调用另一个类的静态方法,在这个被调用的方法中,我想在某些特定情况下显示一个 toast 消息。

我还尝试创建一个扩展 Application 的支持类,在该类中,我需要在需要时获取应用程序上下文,但无事可做。

这是调用静态方法 AllInterfacesActived 的 Service 类中的方法:

    public int onStartCommand(Intent intent, int flags, int startId) {

    //flag variable that indicates if service is scanning
    isScanning = true;

    final int result;

    turnGPSOn();


    /*GET WIFI DATA, we use a thread and with scheduleAtFixedRate we run it repeatedly with the wifi scan interval*/ 
    Wifitimer.scheduleAtFixedRate(new TimerTask() {


        @Override
        public void run() {
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());

            //we are in wifi case, we set umts string result to "" because we don't perform a umts scansion
            String resultUMTS = "";

            //call the SCANWIFI METHOD to scan the networks and to obtain their data
            String resultScan = scanWifi();
            Intent mIntent = new Intent();
            mIntent.setAction(INTENT_ACTION);

            //put information on wifi and umts in the intent
            mIntent.putExtra(INTENT_EXTRA_WIFI, "Waiting for umts scansion...\nWIFI SCAN PERFOMED"+resultScan+"\nUMTS\n"+resultUMTS);

            //broadcast of data
            Bundle xtra = new Bundle();
            sendBroadcast(mIntent);

            /*
             * when all interfaces are actived we call AllInterfacesActived() of OracoloBrain.java
             */
            if(getUseOracolo())
                if(isAPNEnabled(getApplicationContext()) && isGpsEnable() && isWifiEnabled()){
                    OracoloBrain.AllInterfacesActived();     
                }


        }
    }, 0,MainActivity.getWifiInterval());

//other code of the onStartCommand method...

在 OracoloBrain 类(非活动类)中,我有静态方法 AllInterfacesActived。我省略了有关此方法的代码,但在特定情况下,我想展示一个 Toast。我尝试创建另一个名为 MyApplication.java 的类:

public class MyApplication extends Application {

private static Context context;

public void onCreate(){
    super.onCreate();
    MyApplication.context = getApplicationContext();
}

public static Context getAppContext() {
    return MyApplication.context;
}
}

因此,我尝试使用此上下文启动 toast,但无事可做。

4

3 回答 3

1

您可以在主线程上创建一个处理程序对象,然后您可以稍后使用它来显示您的 toast。下面是一个示例代码,可以帮助您。

class MyService extends Service{
Handler handler ;
onStartCommand(intent int , int flags,int startId){
handler = new Handler(); // this will get instantiated on the main thread;
new Thread(new Runnable() {

                    @Override
                    public void run() {
                        dispatchMessage("this is a toast");

                    }
                }).start();


}
public void dispatchMessage(final String message) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                System.out.println(message);
                Toast.makeText(MyService.this, message, Toast.LENGTH_SHORT).show();
            }
        });

    }

}

您可以阅读更多关于 Handlers 的内容,以了解我为在除主线程之外的其他线程上展示 Toast 所做的工作。

于 2014-08-27T15:21:46.353 回答
0

您可以将应用程序的上下文发送到您的班级:

在您的非活动课程中:

private static Context c;

public static Context getAndSetMyContext(Context c) {
this.c = c;
}

之后,您可以:

Toast.makeText (c, "YOUR TEXT", Toast.LENGTH_LONG).show();

在你的活动课上:

YourClass.getAndSetMyContext(getBaseContext());
于 2014-08-27T15:09:57.140 回答
0

你的服务的超级等级是什么?如果它是 IntentServiceToast则没有显示,因为您没有将其发布在主 UI 线程上。你必须这样做:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable { 
    @Override
    public void run() {
        Toast.makeText(context/*Use app context here from your Application subclass*/, "", Toast.SHORT);
});
于 2014-08-27T15:26:25.603 回答