java postdelayed_Android-定期使用postDelayed()运行方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值