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()功能仍然会被执行,这正是我想要的。现在,当用户重新启动应用程序时,我onCreate()会再次被调用,并且每秒会sendData()被调用两次。就这样继续下去。每次用户出来并重新开始时,sendData()每秒都会发生一次。

我究竟做错了什么?是我的new Handler()创作问题吗?处理这个问题的最佳方法是什么?我希望sendData()每秒打一个电话,直到用户退出应用程序(表单应用程序管理器)。

4

8 回答 8

105
final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {
        //Do something after 100ms
        Toast.makeText(c, "check", Toast.LENGTH_SHORT).show();  
        handler.postDelayed(this, 2000);
      }
    }, 1500);
于 2013-12-26T11:51:46.643 回答
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();
        }   
    }
};

在这种方法中,如果您在 activity 或 call 上按返回键finish();,它也会停止postDelayed调用。

于 2012-06-01T06:12:53.710 回答
28

为什么不创建服务并将逻辑放入onCreate(). 在这种情况下,即使您按下返回按钮,服务也会继续执行。一旦您进入应用程序,它就不会 onCreate()再次调用。相反,它会调用onStart()

于 2012-06-01T06:11:17.307 回答
16

您可以像这样简化代码。

在 Java 中:

new Handler().postDelayed (() -> {
    //your code here
}, 1000);

在科特林:

Handler().postDelayed({
   //your code here
}, 1000)
于 2017-09-25T08:47:50.397 回答
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 回答
1
Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what==0){
            // do stuff
            h.removeMessages(0);  // clear the handler for those messages with what = 0
            h.sendEmptyMessageDelayed(0, 2000); 
        }
    }
};


 h.sendEmptyMessage(0);  
于 2017-10-26T17:36:54.067 回答
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。如果此 Activity 不是 Launch Activity。你应该在这个活动中设置android:launchMode="singleTask"

于 2012-06-01T06:17:47.817 回答