安卓:从IntentService吐司仍然在屏幕上永远(Android: Toast from In

2019-09-22 09:41发布

我查了一下这个问题 ,但它似乎没有回答我的问题,这是涉及的要少得多。 我打电话从菜单项在我的主要过程的IntentService。 这是目前只是其搭设在onHandleIntent敬酒()最终应该在处理结束短暂地出现说这是完成了骨架。 但是它仍然是屏幕,直到永远(即使该应用程序已停止)上。 我与模拟器和我的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;
}

编辑:我发现这篇文章 ,这也许可以解释这个问题。 引用一句话:

但是,您只能在主界面线程使用面包,否则你遇到的问题,其中吐司消息没有一段时间后消失(因为是主界面背景不知道在一个单独的线程上下文中使用吐司任何消息)。

Answer 1:

在我的编辑链接到文章使我这个博客它固定我的问题。 我没有看到其他地方,你不能从一个服务直接发出敬酒。 所以我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
}

(如果任何人都可以解释为什么我不得不注释掉@覆盖上运行(),以避免错误,我将不胜感激。有我的应用程序的其它几个地方,我不得不这样做。)

编辑:我才刚刚发现这个帖子这几乎是同样的事情。 我不知道我怎么以前错过了。



Answer 2:

onHandleIntent是在工作线程执行。

我会尝试从UI线程中执行Toast.show()。



文章来源: Android: Toast from IntentService remains on screen for ever