3

私はこの質問をチェックしましたが、それは私の問題に答えていないようです。メインプロセスのメニュー項目からIntentServiceを呼び出しています。これは現在、onHandleIntent()にトーストを配置する単なるスケルトンであり、最終的には処理の最後に一時的に表示され、終了したことを示します。ただし、(アプリケーションが停止している場合でも)画面に表示されたままになります。エミュレーターとGalaxyS2の両方でテストしたところ、同じ結果が得られました。誰かが私を正しい方向に向けることができますか?

これはサービスコードです:

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

編集:私はこの記事を見つけました、それは問題を説明するかもしれません。一文を引用するには:

ただし、ToastはメインGUIスレッドでのみ使用できます。そうしないと、Toastメッセージが一定期間後に消えないという問題が発生します(メインGUIコンテキストは別のスレッドコンテキストで使用されるToastメッセージについて何も知らないため) )。

4

2 に答える 2

8

私の編集でリンクされた記事は、私の問題を修正したこのブログに私を導きました。サービスから直接トーストを発行できないことは他では見たことがありません。したがって、私の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をコメントアウトしなければならなかった理由を誰かが説明できれば、ありがたいです。アプリケーションには、それをしなければならなかった場所が他にもいくつかあります。)

編集:私はこの投稿を見つけたばかりで、これは事実上同じものです。以前にどうやって逃したのかわかりません。

于 2012-09-13T19:39:34.730 に答える
2

onHandleIntentはワーカースレッドで実行されます。

UIスレッドからToast.show()を実行しようとします。

于 2012-09-13T19:40:30.173 に答える