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

4
在我的Android应用程序中,我正在尝试每5秒执行一项任务。
我尝试过类似以下方式的方法:
@Override
public void onCreate() {
   //standard initialization code

    letsChange();           //method name

    try{
        wait(1000);
    } catch(Exception e) {
        e.printstackstrace();
    }
}

但我收到以下错误信息:

java.lang.IllegalMonitorStateException: 在wait()方法调用前没有锁定对象

我该怎么办才能解决这个问题?


如果可能,请上传您的整个代码 - sharan
https://dev59.com/HV8d5IYBdhLWcg3wpzhf - Zamrony P. Juhara
1个回答

2
当您在类中调用wait()时,实际上是在当前类的实例上调用wait()。为此,需要锁定该实例。如果另一个线程拥有该锁,则无法等待。
synchronized添加到onCreate()将获取锁(Activity的当前实例),并允许您在其中调用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()内部的代码在所需延迟(1000毫秒)后运行,然后每隔1000毫秒运行一次,直到满足终止条件。


但是这个东西只会在特定时间运行一次代码。我希望它能每5秒运行一次我的代码,直到我说停止。那么我可以用for循环吗? - g33k
那么你可以在 Runnable 中添加逻辑来循环。类似于 if (!conditionMet()) handler.postDelayed(....)。当然,你必须将 Handler 声明为 final,以便从 Runnable 内部访问它。 - David Rawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接