运行临时循环的Android代码

运行临时循环的Android代码,android,while-loop,lifecycle,android-anr-dialog,Android,While Loop,Lifecycle,Android Anr Dialog,我想制作一个android应用程序,它将完成启动,然后运行while循环,直到用户完成某项任务。然后,代码将运行另一个函数以确保用户正确完成任务。我该怎么办呢。我已经尝试将while循环放在onCreate、onStart和onResume中,并且在所有while循环中永远运行,而不让GUI绘制,因此使任务无法完成(有时还会收到ANR消息)。我应该把while循环放在哪里,这样它就可以在活动开始后立即运行,并且不会干扰启动 谢谢 安德烈·维吉斯17 编辑3-31-13 2:45太平洋标准时间:

我想制作一个android应用程序,它将完成启动,然后运行while循环,直到用户完成某项任务。然后,代码将运行另一个函数以确保用户正确完成任务。我该怎么办呢。我已经尝试将while循环放在onCreate、onStart和onResume中,并且在所有while循环中永远运行,而不让GUI绘制,因此使任务无法完成(有时还会收到ANR消息)。我应该把while循环放在哪里,这样它就可以在活动开始后立即运行,并且不会干扰启动

谢谢

安德烈·维吉斯17

编辑3-31-13 2:45太平洋标准时间:

所以我接受了RyPope的建议,创建了一个新线程,我从主线程调用了一个函数,它不喜欢这样。以下是我的全部代码:

` 公共类MainActivity扩展了活动{

public EditText pass1, pass2, pass3, pass4;
public int current = 1;
public boolean enteringCode = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pass1 = (EditText) findViewById(R.id.pass1);
    pass2 = (EditText) findViewById(R.id.pass2);
    pass3 = (EditText) findViewById(R.id.pass3);
    pass4 = (EditText) findViewById(R.id.pass4);

    new Thread(new Runnable() {
        public void run() {
            checkInputs();
        }
    }).start();
}

public void checkInputs() {
    while(enteringCode) {
        if(pass1.getText().toString().length() > 0) {
            current = 2;
        }
        if(pass2.getText().toString().length() > 0) {
            current = 3;
        }
        if(pass3.getText().toString().length() > 0) {
            current = 4;
        }
        if(pass4.getText().toString().length() > 0) {
            enteringCode = false;
            System.out.println(Integer.parseInt(pass1.getText().toString() + pass2.getText().toString() + pass3.getText().toString() + pass4.getText().toString()));
            authenticateCode(Integer.parseInt(pass1.getText().toString() + pass2.getText().toString() + pass3.getText().toString() + pass4.getText().toString()));
        }
        if(current == 1) {
            pass1.requestFocus();
        }
        if(current == 2) {
            pass2.requestFocus();
        }
        if(current == 3) {
            pass3.requestFocus();
        }
        if(current == 4) {
            pass4.requestFocus();
        }
    }
}

public void authenticateCode(int code) {

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
} ` 因此,当此操作运行时,视图尝试请求焦点时,它崩溃,我得到以下logcat输出:


03-31 14:46:54.803:E/AndroidRuntime(10922):致命异常:线程4197
03-31 14:46:54.803:E/AndroidRuntime(10922):android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4062)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:730)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:779)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.ViewGroup.invalidateChild(ViewGroup.java:4005)上
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.invalidate(view.java:8605)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.onFocusChanged(view.java:3884)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.widget.TextView.onFocusChanged(TextView.java:8281)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.unFocus(view.java:3814)上
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.ViewGroup.requestChildFocus(ViewGroup.java:530)上
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.handleFocusGainInternal(view.java:3706)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.requestFocus(view.java:5402)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.requestFocus(view.java:5352)
03-31 14:46:54.803:E/AndroidRuntime(10922):在android.view.view.requestFocus(view.java:5330)
03-31 14:46:54.803:E/AndroidRuntime(10922):位于com.thirteenbit.driveSafe.MainActivity.checkInputs(MainActivity.java:51)
03-31 14:46:54.803:E/AndroidRuntime(10922):位于com.thirteenbit.driveSafe.MainActivity$1.run(MainActivity.java:26)
03-31 14:46:54.803:E/AndroidRuntime(10922):在java.lang.Thread.run(Thread.java:856)处


有人找到了解决这一困境的办法吗?

也许最好是创建一个新的解决方案,这样初创企业就不会陷入困境。 在onCreate中尝试以下操作:

new Thread(new Runnable() {
    public void run() {
        while(true)
        {

        }
    }
}).start();

我认为你的观念有缺陷。您可能并不真的希望循环正在运行。您希望在用户完成任务后发生一些事情。您应该使用一个在用户完成任务后激活的侦听器。

当您想让某些代码在循环中运行时,您必须在新线程上运行它,因为在主(UI)线程上执行此操作时,您的应用程序无法更新UI,因为主线程一直由您使用。所以试着做新的或更好的


我希望这对您很有用。

onCreate()
可能没问题,但我们必须查看您的代码才能知道问题所在。另外,如果logcat正在崩溃,请单击logcat。如果它是网络的东西,那么它将需要在后台线程中完成,那么这将允许我的操作在启动运行时在后台运行?还有,当我完成踏板时,我该如何结束踏板?好吧,我试过了,现在它启动了,但是当用户完成活动时,它被编程为将另一个视图置于焦点,当这种情况发生时,它会崩溃,logcat说只有原始线程可以接触它的视图。你不能在mainActivity中调用函数并在原始线程上执行操作吗?尝试使用thread.shouldContinue=false;thread.join();基本上,我有一个新线程,它调用一个函数,这个函数位于原始线程的内部,如下
new thread(new Runnable(){public void run(){checkInputs();}}})当checkInputs()位于主线程内并引用来自主UI和主线程的视图和变量时。显然android不喜欢这样,所以logcat给了我这个
致命的异常:Thread-4167 android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触它的视图嗯,试试这个:runOnUiThread(newrunnable(){public void run(){});希望它不会让你回到原来的问题。