-1

起動を完了し、ユーザーが特定のタスクを完了するまで 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)

この苦境を解決した人はいますか?

4

3 に答える 3

1

スタートアップがループでハングアップしないように、新しいスレッドを作成するのがおそらく最善です。onCreateでこれを試してください:

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

        }
    }
}).start();
于 2013-03-31T21:14:29.523 に答える
0

あなたのコンセプトには欠陥があると思います。おそらく、ループを実行したくないでしょう。ユーザーがタスクを完了した後に何かを実行したい。ユーザーがタスクを完了した後にアクティブになるリスナーを使用する必要があります。

于 2013-03-31T21:15:50.230 に答える
0

いくつかのコードをループで実行する場合は、新しいスレッドで実行する必要があります。これは、メイン (UI) スレッドでこれを実行すると、メイン スレッドが常に使用されるため、アプリケーションが UI を更新できないためです。そのため、新しいスレッドまたはタイマーを作成してみてください(そのほうがよいでしょう)。

これがあなたの役に立てば幸いです。

于 2013-03-31T21:16:00.183 に答える