1

アプリケーションにプログレス バーを表示しようとしていますが、スレッドの問題が発生しています。これが私がそれを行うために使用しているコードです:

package com.integrated.mpr;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class Progess extends Activity {

   static String[] display = new String[Choose.n];
   private static final int Progress = 0;

   ProgressBar bar;
   TextView label;
   Handler handler = new Handler();

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      setContentView(R.layout.progress);

      bar = (ProgressBar) findViewById(R.id.progBar);

      new Thread(new Runnable() {

         int i = 0;
         int progressStatus = 0;

         public void run() {
            while (progressStatus < 100) {
               progressStatus += doWork();
               try {
                  Thread.sleep(500);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }

               // Update the progress bar
               handler.post(new Runnable() {
                  public void run() {
                     bar.setProgress(progressStatus);
                     i++;
                  }
               });
            }
         }

         private int doWork() {
            display = new Logic().finaldata();
            return i * 3;
         }

      }).start();

      Intent openList = new Intent("com.integrated.mpr.SENSITIVELIST");
      startActivity(openList);
   }
}

次の logcat メッセージが表示されます。

05-30 12:38:00.082: E/AndroidRuntime(17332): java.lang.RuntimeException: Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません

私を助けてください、私はスレッド化が初めてです。

4

3 に答える 3

4

この方法でスレッドを実装する代わりに、Android で無痛スレッド化として知られるAsyncTaskを実装することをお勧めします。

  1. 内部にプログレスバーを表示onPreExecute()
  2. 内部でバックグラウンド タスクを実行するdoInBackground()
  3. 内部の進行状況バーを閉じるonPostExecute()
  4. 内部の進行状況バーを更新するonProgressUpdate()
于 2012-05-30T07:28:27.827 に答える
0

答えはあなたの質問からのエラーメッセージにあると思います-ちょうどLooper.prepare()前に書いてくださいhandler.post(new Runnable() ...)

ここにいくつかの参考文献があります:

于 2012-05-30T07:29:58.650 に答える
0

簡単なものとして、以下のコードを試してください。

runOnUiThread(new Runnable(){
    @Override
    public void run() {
        bar.setProgress(progressStatus);
        i++;

    }  
}
于 2012-05-30T07:30:58.667 に答える