Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序中等待前未被线程锁定的对象_Android - Fatal编程技术网

Android应用程序中等待前未被线程锁定的对象

Android应用程序中等待前未被线程锁定的对象,android,Android,在我的Android应用程序中,我尝试每5秒执行一次任务 我试过这样做: @Override public void onCreate() { //standard initialization code letsChange(); //method name try{ wait(1000); } catch(Exception e) { e.printstackstrace(); } } 但我收到以

在我的Android应用程序中,我尝试每5秒执行一次任务

我试过这样做:

@Override
public void onCreate() {
   //standard initialization code

    letsChange();           //method name

    try{
        wait(1000);
    } catch(Exception e) {
        e.printstackstrace();
    }
}
但我收到以下错误消息:

java.lang.IllegalMonitorStateException:对象在等待()之前未被线程锁定

如何停止此操作?

在类内调用
wait()
时,实际上是在该类的当前实例上调用
wait()
。为此,它需要对该实例进行锁定。如果另一个线程有锁,您将无法等待

synchronized
添加到
onCreate()
将获得锁(当前的
活动实例
)并允许您在内部调用
wait()
,但这绝对不是您想要做的,因为它会阻塞主/UI线程并导致应用程序无响应

您可能想要的是活动中的以下内容:

private boolean isTerminationConditionMet = false;

@Override
public void onCreate() {
    //standard Android onCreate code 

    final Handler handler = new Handler();
    final Runnable task = new Runnable() {
        @Override
        public void run() {
            //code you want to run every second
            if (!isTerminationConditionMet()) {
                handler.postDelayed(task, 1000);
            }
        }
    }
    handler.postDelayed(task, 1000);
}

这将导致
run()
中的代码在所需延迟(1000ms)后运行,然后每1000ms运行一次,直到满足终止条件。

如果可能,请上载整个代码,但此操作将在特定时间后仅运行此代码一次。我希望它每5秒运行一次我的代码,直到我说停止。那么我可以使用for循环来实现这个功能吗?那么,您可以向
Runnable
to循环添加逻辑。类似于
if(!conditionMet())handler.postDelayed(..)
。当然,您必须使
处理程序成为final,才能从
可运行