起動を完了し、ユーザーが特定のタスクを完了するまで while ループを実行する Android アプリを作成したいと思います。次に、コードは別の関数を実行して、ユーザーがタスクを正しく完了したことを確認します。これについてどうすればいいですか。onCreate、onStart、および onResume に while ループを入れようとしましたが、すべての while ループが GUI を描画せずに永遠に実行されたため、タスクを完了できなくなりました (また、ANR メッセージが表示されることもあります)。そのアクティビティの開始直後に実行され、起動を妨げないようにするには、while ループをどこに配置すればよいですか?
ありがとう、
アンドレギース17
編集 3-31-13 2:45 PST:
そこで、RyPope のアドバイスを受けて新しいスレッドを作成し、メイン スレッドから関数を呼び出していますが、それは気に入りません。ここにすべての私のコードがあります:
` public class MainActivity extends Activity {
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): FATAL EXCEPTION: Thread-4197
03-31 14:46:54.803: E/AndroidRuntime(10922): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4062)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:730)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:779)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4005)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.invalidate(View.java:8605)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.onFocusChanged(View.java:3884)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.widget.TextView.onFocusChanged(TextView.java:8281)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.unFocus(View.java:3814)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.ViewGroup.requestChildFocus(ViewGroup.java:530)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.handleFocusGainInternal(View.java:3706)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5402)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5352)
03-31 14:46:54.803: E/AndroidRuntime(10922): at android.view.View.requestFocus(View.java:5330)
03-31 14:46:54.803: E/AndroidRuntime(10922): at com.thirteenbit.driveSafe.MainActivity.checkInputs(MainActivity.java:51)
03-31 14:46:54.803: E/AndroidRuntime(10922): at com.thirteenbit.driveSafe.MainActivity$1.run(MainActivity.java:26)
03-31 14:46:54.803: E/AndroidRuntime(10922): at java.lang.Thread.run(Thread.java:856)
この苦境を解決した人はいますか?