0

アプリケーションの作成時に、長い操作 (ファイルのコピー/読み込みなど) を実行したいと考えています。そのためにスレッドを作成しましたが、そのスレッドは UI を更新しません。Looper.prepare() を呼び出さずにスレッドでハンドラーを作成できないというエラーが発生しました。私のコードの何が問題になっていますか?

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    threadFileManager = new Thread (
        new Runnable() {
            public void run() {
                FileManager fM = new FileManager();
                fM.copyFileFromAssetToStorage();                
        }
    }); 
    threadFileManager.start();
}

編集:Activityのサブクラスである場合、エラーはFileManagerクラスにありました。サービスへの変更は機能しました。

4

3 に答える 3

2

Applicationクラスはこれを行うには間違った場所です。必要に応じて、ApplicationonCreate()メソッドを使用して を開始することもできServiceます。Serviceの目的はバックグラウンドで処理を行うことであるため、このバックグラウンド スレッドを に実装する必要がServiceあります。このApplicationクラスはめったに使用しないでください。これは、最小限のグローバル状態を維持するための最後の手段です。

このコードを に移動するとServiceLooper.prepare()はすでに Android によって呼び出されています。

編集:

OPは、FileManagerクラスのコンストラクターを呼び出したときに、実際にスレッド内にハンドラーを作成しようとしていました。上記の私のコメントはまだ真実ですが、アプリケーションではなくアクティビティをサブクラス化していたため、OP の質問には関係ありません。

明確にするために、実際の問題は、(new FileManager() を介して) まだ Looper.prepare() を呼び出していない Thread 内に Handler を作成していたことにありました。正しい修正は、メイン スレッド、つまり、Activity または Service コールバックのいずれかに Handler を作成することです。

于 2012-07-07T02:56:09.973 に答える
1

UIスレッドを使用して、スレッドからUIを更新できます..のように

    yourActivityName.this.runOnUiThread(new Runnable() {
    public void run() {
      //make UI modification here
  }
});
于 2012-07-07T03:29:43.023 に答える
1

代わりにこれを試してください:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Thread thread=new Thread(this);
        thread.start();
        }
    public void run() {
            FileManager fM = new FileManager();
            fM.copyFileFromAssetToStorage(); 
            handler.sendEmptyMessage(0);
        }
    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

            }
        };

Runnable を Activity に実装するよう求められます。これがお役に立てば幸いです。

于 2012-07-07T04:44:11.663 に答える