运行临时循环的Android代码
我想制作一个android应用程序,它将完成启动,然后运行while循环,直到用户完成某项任务。然后,代码将运行另一个函数以确保用户正确完成任务。我该怎么办呢。我已经尝试将while循环放在onCreate、onStart和onResume中,并且在所有while循环中永远运行,而不让GUI绘制,因此使任务无法完成(有时还会收到ANR消息)。我应该把while循环放在哪里,这样它就可以在活动开始后立即运行,并且不会干扰启动 谢谢 安德烈·维吉斯17 编辑3-31-13 2:45太平洋标准时间: 所以我接受了RyPope的建议,创建了一个新线程,我从主线程调用了一个函数,它不喜欢这样。以下是我的全部代码: ` 公共类MainActivity扩展了活动{运行临时循环的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太平洋标准时间:
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(){});希望它不会让你回到原来的问题。