gpt4 book ai didi

java - 每秒运行一次的安全 Whileloop

转载 作者:行者123 更新时间:2023-12-02 05:35:39 24 4
gpt4 key购买 nike

所以我想要一个每秒运行一次的 whileloop,但似乎使用 Thread.sleep(1000); ,它不起作用,因为它会使应用程序卡住并因以下错误而崩溃:

07-28 15:03:17.641: A/libc(5792): Fatal signal 6 (SIGABRT) at 0x00000280 (code=0), thread 5792 ()

所以我猜测我使用的循环不够安全并且使用了太多资源该循环在服务中运行,并由操作按钮启动:)

while(buttonpressed != false);
try {
writer = new FileWriter(timedata);
writer.append(TIME);

writer.flush();
writer.close();
Thread.sleep(1000);
}

最佳答案

使用AlarmManager反而。

注册您的服务以每秒运行一次上述操作(来自 this question ):

  Intent myIntent = new Intent(context, MyServiceReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 1); // first time
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000, pendingIntent);

您想要做的是在 UI 线程(负责更新面向用户的 UI 更改的线程)上调用 sleep(1000)。这在 Android 上是一个很大的禁忌,因为它会让你的应用程序看起来没有响应。

编辑用户评论后进行澄清:

我不知道您如何设置buttonpressed,但您可能想使用OnTouchListener :

boolean shouldBeDoingThings = true;
writer = new FileWriter(timedata);
Button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
shouldBeDoingThings = true;
return true;
}
else if(event.getAction() == MotionEvent.ACTION_UP){
shouldBeDoingThings = false;
return true;
}
return false;
}
});

然后,您使用消息或 Intent 来启动流程(AlarmReceiver 向您的服务发送消息以将 shouldBeDoingThings 设置为 true)。

之后,您可以在服务中的某个位置运行:

class Task implements Runnable {

private long lastUpdatedTime;

public Task()
{
lastUpdatedTime = 0;
}

@Override
public void run() {
if(shouldBeDoingThings)
{
if(TIME - lastUpdatedTime > 1000)
{
writer.append(TIME);
writer.flush();
lastUpdatedTime = TIME;
}
}
}
}
}

总而言之,永远记住:永远不要阻塞 UI 线程。这适用于当今大多数移动 SDK。

希望我能帮您解决问题。

关于java - 每秒运行一次的安全 Whileloop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24996686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com