2

スレッドを使用して進行状況バーを表示しようとしています..スレッドの概念があまりないことを受け入れます。

ここにコードがあります

public class Progress extends Activity {

    static String[] display;
    private static final int Progress = 0;      
    private ProgressBar mProgress;
    private int mProgressStatus = 0;
    private Handler mHandler = new Handler();

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

        mProgress = (ProgressBar) findViewById(R.id.progressBar);

        // Start lengthy operation in a background thread
        new Thread(new Runnable() {
            public void run() {
                while (mProgressStatus < 100) {
                    mProgressStatus = doWork();

                    // Update the progress bar
                    mHandler.post(new Runnable() {
                        public void run() {
                            mProgress.setProgress(mProgressStatus);
                        }
                    });
                }
            }

            private int doWork() {                  
                display = new Logic().finaldata();
                // TODO Auto-generated method stub
                return 100;
            }
        }).start();
    }
}

実行時のlogcatメッセージは

java.lang.RuntimeException: Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません

私がここでやっている間違いは何ですか?

4

3 に答える 3

3

したがって、あなたの問題は他の場所にあります。あなたの例を Handler で試してみましたが、うまくいきました。

package com.sajmon.threadsDemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;
import android.widget.TextView;

    public class ThreadsDemoActivity extends Activity {

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

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            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() {

                    return i * 3;
                 }

                }).start();         

        }
    }

そして XML:

<ProgressBar 
        android:id="@+id/progBar" style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

これを見て、これと同じようにコードを編集してください。

于 2012-05-28T09:36:20.423 に答える
1

スレッドを使用したプログレスバーの更新に関する以下のサンプルコードを見つけてください

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

public class ThreadDemo1ProgressBar extends Activity
{
    ProgressBar bar;
    TextView msgWorking;
    boolean isRunning = false;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            bar.incrementProgressBy(5);
            if (bar.getProgress() == bar.getMax()) {
                msgWorking.setText("Done");
                bar.setVisibility(View.INVISIBLE);
            } else {
                msgWorking.setText("Working..." +
                        bar.getProgress());
            }
        }// handleMessage
    };

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        bar = (ProgressBar) findViewById(R.id.progress);
        bar.setMax(100);
        msgWorking = (TextView) findViewById(R.id.TextView01);
    }

    public void onStart() {
        super.onStart();
        bar.setProgress(0);

        Thread background = new Thread(new Runnable() {
            public void run() {
                try
                {
                    for (int i = 0; i < 20 && isRunning; i++) {

                        Thread.sleep(1000);
                                handler.sendMessage(handler.obtainMessage());
                    }
                }
                catch(Throwable t) {
                    // just end the background thread
                }
            }
        });
        isRunning = true;
        background.start();
    }// onStart

    public void onStop() {
        super.onStop();
        isRunning = false;
    }
}// ThreadDemo1ProgressBar

5秒ごとにプログレスバーを更新するaboutの例。

于 2012-05-28T09:47:18.423 に答える
0

私は実際にスレッドインスタンスを一度作成するだけで、とにかく動作します。このコードは、スタートアップ アクティビティで作成されました。メソッドを呼び出しshowSpinner1()てスピナーを表示/非表示にするだけです。

メソッドでこれ getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);onCreate()必ず実行し、このコードを使用してスピナーのオンとオフを切り替えます。

// Spinner related code - The thread is created just once and is used multiple times (works!!)
boolean toShow = false;
Thread spinner1Thread = new Thread("Show/Hide Spinner Thread") {

    @Override
    public void run() {
        setProgressBarIndeterminateVisibility(toShow);
    }

};

/**
 * Shows and hides the spinner
 * @param pShow
 */
public void showSpinner1(boolean pShow) {
    toShow = pShow;
    runOnUiThread(spinner1Thread);
}
于 2012-05-28T10:00:46.043 に答える