46

Android アプリで、毎秒実行する必要があるネットワーク アクティビティ (データの送信) を開始したい状況があります。私は次のようにこれを達成します:

私はonCreate()コードを持っています:

tv = new TextView(this);
tv.postDelayed(sendData, 1000);

sendData()機能:

   Handler handler = new Handler();
   private Runnable sendData=new Runnable(){
    public void run(){
        try {
            //prepare and send the data here..
            handler.removeCallbacks(sendData);
            handler.postDelayed(sendData, 1000);    
        }
        catch (Exception e) {
            e.printStackTrace();
        }   
    }
};

問題は次のようになります。ユーザーが戻るボタンを押してアプリが出てくる (UI が消える) と、sendData()機能がまだ実行されます。ユーザーがアプリを再起動すると、myonCreate()が再度sendData()呼び出され、1 秒に 2 回呼び出されます。それはそのように続きます。ユーザーが出てきて再起動するたびに、sendData()1 秒あたり 1 回以上発生します。

私は何を間違っていますか?それは私のnew Handler()作成の問題ですか?これを処理する最善の方法は何ですか? sendData()ユーザーがアプリを終了するまで (アプリケーション マネージャーから)、毎秒 1 回の呼び出しが必要です。

4

8 に答える 8

30

おそらく、これを達成するためにアクティビティのライフサイクル メソッドを使用します。

Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      handler.post(sendData);
}

@Override
protected void onDestroy() {
      super.onDestroy();
      handler.removeCallbacks(sendData);
}


private final Runnable sendData = new Runnable(){
    public void run(){
        try {
            //prepare and send the data here..


            handler.postDelayed(this, 1000);    
        }
        catch (Exception e) {
            e.printStackTrace();
        }   
    }
};

このアプローチでは、アクティビティまたは callで戻るキーを押すと、 postDelayedfinish();呼び出しも停止します。

于 2012-06-01T06:12:53.710 に答える
28

サービスを作ってロジックを入れてみませんかonCreate()?この場合、戻るボタンを押してもサービスは実行され続けます。アプリケーションに入ると、 onCreate()再び呼び出されることはありません。むしろ呼んでくれるonStart()

于 2012-06-01T06:11:17.307 に答える
2

以下のコードで私の側で動作していることを確認してください。同じアクティビティを行っている場合、ハンドラーは1秒ごとに実行されます

 HandlerThread handlerThread = new HandlerThread("HandlerThread");
                handlerThread.start();
                handler = new Handler(handlerThread.getLooper());
                runnable = new Runnable()
                {
                    @Override
                    public void run()
                    {

                            handler.postDelayed(this, 1000);
                        }
                };
                handler.postDelayed(runnable, 1000);
于 2015-02-11T22:37:54.180 に答える
0

複数のインスタンスのように聞こえるので、さまざまなアクティビティ フラグを試すことができると思います。

"singleTop" "singleTask" "singleInstance"

私が試してみたいものは、マニフェスト内で定義できます。

http://developer.android.com/guide/topics/manifest/activity-element.html

于 2012-06-01T06:13:30.353 に答える
0

Manifest.xml で、 andrid:allowRetainTaskState="true"を Launch Activity に設定する必要があります。このアクティビティが Launch アクティビティでない場合。このアクティビティでandroid:launchMode="singleTask"を設定する必要があります

于 2012-06-01T06:17:47.817 に答える