我有一个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()
调用。
答案 0 :(得分:94)
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);
答案 1 :(得分:27)
也许参与活动的生命周期方法来实现这一目标:
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 来电。
答案 2 :(得分:26)
为什么不在onCreate()
中创建服务并放置逻辑。在这种情况下,即使按下后退按钮服务也将继续执行。一旦你进入申请,它就不会打电话
再次onCreate()
。相反,它会调用onStart()
答案 3 :(得分:10)
您可以像这样简化代码。
在Java中:
new Handler().postDelayed (() -> {
//your code here
}, 1000);
在Kotlin:
Handler().postDelayed({
//your code here
}, 1000)
答案 4 :(得分: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);
答案 5 :(得分: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);
答案 6 :(得分:0)
我认为你可以试验不同的活动标志,因为它听起来像是多个实例。
“singleTop” “singleTask” “singleInstance”
我会尝试的那些,它们可以在清单中定义。
http://developer.android.com/guide/topics/manifest/activity-element.html
答案 7 :(得分:0)
您应该将 andrid:allowRetainTaskState =“true”设置为在Manifest.xml中启动Activity。如果此Activty不是启动活动。你应该在这个活动中设置 android:launchMode =“singleTask”