Android-定期使用postDelayed()运行方法
我在Android应用程序中遇到一种情况,我想启动应该每秒运行的网络活动(发送一些数据)。 我实现如下:
在new Handler()中,我具有以下代码:
tv = new TextView(this);
tv.postDelayed(sendData, 1000);
new Handler()功能:
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消失)时,2986307064101101864448函数仍然会执行,这正是我想要的。 现在,当用户重新启动该应用程序时,我的sendData()被再次调用,而我每秒两次被调用sendData()。 这样下去。 每次用户出现并再次启动时,每秒就会发生sendData()个额外的事件。
我究竟做错了什么? 是我的new Handler()产生问题吗? 处理此问题的最佳方法是什么? 我希望每秒有sendData()个呼叫,直到用户退出应用程序(窗体应用程序管理器)为止。
zolio asked 2020-07-28T11:24:55Z
8个解决方案
100 votes
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);
Saad Asad answered 2020-07-28T11:27:01Z
29 votes
可能涉及活动的生命周期方法来实现此目的:
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();
}
}
};
在这种方法中,如果您在活动上按返回键或致电finish();,它也会停止postDelayed呼叫。
waqaslam answered 2020-07-28T11:27:25Z
27 votes
为什么不创建服务并在onCreate()中放入逻辑。在这种情况下,即使您按返回按钮,服务也将继续执行。 一旦您进入应用程序,它将不会调用onCreate()再次 而是会拨打onStart()
Vipul Shah answered 2020-07-28T11:26:45Z
13 votes
您可以像这样简化代码。
在Java中:
new Handler().postDelayed (() -> {
//your code here
}, 1000);
在科特林:
Handler().postDelayed({
//your code here
}, 1000)
Varun Chandran answered 2020-07-28T11:27:54Z
2 votes
请在下面的代码中检查以下内容是否对我有利:当您处于同一活动中时,处理程序将每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);
sharma_kunal answered 2020-07-28T11:28:14Z
1 votes
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);
Dan Alboteanu answered 2020-07-28T11:28:29Z
0 votes
我认为您可以尝试使用不同的活动标志,因为它听起来像多个实例。
“ singleTop”“ singleTask”“ singleInstance”
是我会尝试的方法,可以在清单中定义它们。
[HTTP://developer.Android.com/贵的/topics/manifest/activity-element.HTML]
Tony answered 2020-07-28T11:29:03Z
0 votes
您应该将android:alwaysRetainTaskState =“ true”设置为Manifest.xml中的Launch Activity。 如果此活动不是启动活动。 您应该在此活动中设置android:launchMode =“ singleTask”
Folee answered 2020-07-28T11:29:23Z