Android:来自 IntentService 的 Toast 永远保留在屏幕上

2024-01-14

我检查了这个问题 https://stackoverflow.com/questions/12200925/toast-doesnt-disappear-from-screen,但它似乎没有回答我的问题,这个问题涉及的少得多。我正在从主进程中的菜单项调用 IntentService。它目前只是一个在 onHandleIntent() 中放置一个 Toast 的骨架,最终应该在处理结束时短暂出现以表示它已完成。但是它永远保留在屏幕上(即使应用程序停止时)。我使用模拟器和 Galaxy S2 进行了测试,结果相同。有人可以指出我正确的方向吗?

这是服务代码:

 package com.enborne.spine;

 import android.app.IntentService;
 import android.content.Intent;
 import android.util.Log;
 import android.widget.Toast;

 public class SaveFile extends IntentService {
     private final String TAG = "SaveFile";

     public SaveFile() {
         super("SaveFile");
     }

     @Override
     public void onCreate() {
         super.onCreate();
         Log.d(TAG, "Service Started.. ");
     }

     @Override
     public void onDestroy() {
         super.onDestroy();
         Log.d(TAG, "Service Destroyed.. ");
     }

     @Override
     protected void onHandleIntent(Intent intent) {
         // TODO Auto-generated method stub
         Log.d(TAG, "HandleIntent");
         // File saved
         Toast.makeText(this, "File has been saved", Toast.LENGTH_SHORT).show();
     }
 }

(onCreate 和 onDestroy 重写只是暂时用于登录 Eclipse,以便我可以看到发生了什么。)

因此,我从活动中的菜单中调用它(上下文混乱只是因为服务没有启动 - 有些白痴忘记将其包含在清单中!):

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Intent i;
    switch (item.getItemId()) {
    case R.id.chart:
        i = new Intent(getBaseContext(), Chart.class);
        i.putExtra(KEY_CENTRE_LAT, mCentreLat); // centre coordinate
        i.putExtra(KEY_CENTRE_LONG, mCentreLong); // centre coordinate
        i.putExtra(KEY_RADIUS, mRadius); // effective radius
        startActivity(i);
        break;

    case R.id.save:
        Log.d("SaveFile", "Starting service...");
        //      i = new Intent(getBaseContext(), SaveFile.class);
        i = new Intent(this, SaveFile.class);
        startService(i);
        break;
    }
    return true;
}

编辑:我发现本文 http://www.androidsnippets.com/use-toast-wherever-you-want,这或许可以解释问题。引用一句话:

但是,您只能在主 GUI 线程中使用 Toast,否则您会遇到 Toast 消息在一段时间后没有消失的问题(因为主 GUI 上下文不知道有关单独线程上下文中使用的 Toast 消息的任何信息) )。


我编辑中链接的文章引导我这个博客 http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html这解决了我的问题。我在其他地方没有看到你不能直接从服务中发出祝酒词。所以我的 onHandleIntent 现在看起来像这样:

private Handler handler;

@Override
protected void onHandleIntent(Intent intent)
{
    Log.d(TAG, "onHandleIntent");

    /* Stripped out some code here that I added later to keep it similar to
     * my example above
     */

    handler.post(new Runnable()
    {  
//      @Override
        public void run()
        {
            Toast.makeText(getApplicationContext(), "File has been saved", 
                Toast.LENGTH_SHORT).show();
        }
    });    // Display toast and exit
}

(如果有人能解释为什么我必须在 run() 上注释掉 @Override 以避免错误,我将不胜感激。我的应用程序中还有其他几个地方必须这样做。)

编辑:我刚刚发现这个帖子 https://stackoverflow.com/questions/3955410/create-toast-from-intentservice这实际上是同一件事。我不知道我之前是怎么错过的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:来自 IntentService 的 Toast 永远保留在屏幕上 的相关文章

随机推荐