1

私はここで迷っています。ディレクトリ内のファイルを読み取り、アプリの起動時にそれらからボタンを作成する必要があります。while ループを使用する必要があり、UI を更新する必要があります。ランナブルを実行し、ループ内のコードのみを UI スレッドで実行することをかなり長い間試みました。私はAndroidに比較的慣れていませんが、これは十分に簡単に思えました。

このコードは私が今持っているものです。エラーや警告はスローされませんが、何もしません。「ボタンを追加」ボタンがボタンを正しく作成するため、ボタン作成コードが機能することはわかっています。なぜ機能しないのかわかりません。(これは OnCreate で実行されます)

Runnable aRunnable = new Runnable() {

    public void run() {
        Looper.prepare();
        File f = new File(Environment.getExternalStorageDirectory() + "/myapp/");
        File[] filearray = f.listFiles();
        int amount = filearray.length;
        final String[] files = new String[amount];
        int count = 0;
        while (count != amount) {
            files[count] = filearray[count].toString();
            count += 1;
        }
        int times = files.length;
        int counter = 0;
        while (counter != times) {
            Handler handler = new Handler();
            handler.post(new Runnable() {
                public void run() {
                    // Button making code
                }
            });
        }
        Looper.loop();
    }
};
Thread thread = new Thread(aRunnable);
thread.start();
4

2 に答える 2

1

既存のコードの問題の 1 つは、メソッド内のすべてがメイン ( UIrun()と呼ばれることもある) スレッドではなく、バックグラウンド スレッドで実行されることです。

これは、ハンドラー オブジェクトを作成する場所です。

        Handler handler = new Handler();

これは正しくありません。Handlerデフォルトのコンストラクターを使用する場合は、メイン スレッドでを作成 (インスタンス化) する必要があります。ハンドラーのドキュメントから:

public Handler ()API レベル 1 で追加

デフォルトのコンストラクターは、このハンドラーを現在のスレッドのルーパーに関連付けます。このスレッドにルーパーがない場合、このハンドラーはメッセージを受信できないため、例外がスローされます。

したがって、簡単な修正は、そのコード行を前に、メイン スレッドで実行されることがわかっている場所に移動することです。 たとえば、Activity#onCreate()次のようになります。

public void onCreate(Bundle b) {
   super.onCreate(b);

   handler = new Handler();
}

wherehandlerはメンバー変数に変更されます。

private Handler handler;

また、Looper通話を削除してください。

Handler の詳細については、この記事を参照してください

その他のオプション

もう 1 つのオプションは、使用Handlerをまったく避けて、AsyncTask クラスに慣れることです。個人的には、新しい開発者が使いやすいと思います。私が示した vogella.com のリンクにも、 に関する優れた情報がありAsyncTaskます。

もう 1 つのオプションは、ボタンを追加するためにrunOnUiThread()メソッドを避けHandlerて使用することです。Activity

于 2013-09-01T22:21:02.600 に答える