3

サービス クラスを作成しましたが、このクラスで新しいスレッドを実行しようとしています。私の中でサービスが開始され、MainActivityこれはうまくいきます。セクションの最初Toast.MessageonCreate()ものは表示されますが、私のスレッドのメッセージは表示されruna()ません。新しい で動作するはずだと思いましたRunnable()

public class My Service extends Service {
    private static final String TAG = "MyService";
    Thread readthread;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); //is shown

        readthread = new Thread(new Runnable() { public void run() { try {
            runa();
        } catch (Exception e) {
             //TODO Auto-generated catch block
            e.printStackTrace();
        } } });

        readthread.start(); 

        Log.d(TAG, "onCreate");


    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");

    }

    @Override
    public void onStart(Intent intent, int startid) {

        //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();

        //Log.d(TAG, "onStart");

    }
    public void runa() throws Exception{

        Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); //doesn't show up

    }
}

誰かが私を助けることができればいいだろう:)

4

3 に答える 3

5

作成中のThreadは で実行されないため、そこからMainThreadを表示することはできませんToastToast背景からを表示するには、Threadを使用しHandler、それを使用してHandlerを表示する必要がありToastます。

private MyService extends Service {
    Handler mHandler=new Handler();
    //...

    public void runa() throws Exception{
        mHandler.post(new Runnable(){
            public void run(){
                Toast.makeText(MyService.this, "test", Toast.LENGTH_LONG).show()
            }
        }
    }    
}

これはあなたの正確な問題の解決策ですが、あなたが何を達成したいのか正確にはわからないので、それは良い「アーキテクチャ」または実践とは考えていません。

于 2013-05-09T11:03:43.827 に答える
0

スレッドから UI を更新する最良の方法は、ハンドラーまたは UIThread を使用することです

次のコードを試してください:Manifest最初にサービスをファイルに入れることを忘れないでください。

class CapturingSerivce extends Service {
 Handler mHandler=new Handler();

@Override
public IBinder onBind(Intent intent) {
    return null;
}

 public void runa() throws Exception{
        mHandler.post(new Runnable(){
            public void run(){

            }
        });
    }    


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

    return super.onStartCommand(intent, flags, startId);
  }
}
于 2014-06-11T20:47:52.427 に答える