0
public class MainActivity extends Activity implements Runnable{

    private int progressBarStatus = 0;
    private Handler progressBarHandler = new Handler();
    ProgressBar linProgressBar;
    private long fileSize = 0;
    Thread t1;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b1 = (Button)findViewById(R.id.button1);
       Button b2 = (Button)findViewById(R.id.button2);

        b2.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View arg0) 
            {

                linProgressBar.setProgress(0);
                t1.interrupt();
            }

         });

    b1.setOnClickListener(new OnClickListener()
     {

        @Override
        public void onClick(View arg0) 
        {

            basicInitializations();

        }

     });

    }


    public void basicInitializations(){

        linProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
        linProgressBar.setProgress(0);
        linProgressBar.setMax(100);

        try{
            t1 = new Thread() 
            {
                public void run() {
                    while (progressBarStatus < 100) {

                        // process some tasks
                        progressBarStatus = doSomeTasks();

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        // Update the progress bar
                        progressBarHandler.post(new Runnable() {
                            public void run() {
                                linProgressBar.setProgress(progressBarStatus);
                            }
                        });
                    }

                    if (progressBarStatus >= 100) {

                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) 
                        {
                            e.printStackTrace();
                        }

                    }
                }
            };

            t1.start();

        }catch (Exception e) {

        }


    }
    public int doSomeTasks() {

        while (fileSize <= 1000000) {

            fileSize++;

            if (fileSize == 100000) {
                return 10;
            } else if (fileSize == 200000) {
                return 20;
            } else if (fileSize == 300000) {
                return 30;
            }else if (fileSize == 400000) {
                return 40;
            }else if (fileSize == 500000) {
                return 50;
            }

        }

        return 100;

    }


    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}

これは私のメインコードであり、このスレッドを停止できませんでした。ボタンb2(キャンセルボタンなど)をクリックしたときに停止したい。上記のコードは元のコードではなくモデルなので、そのスレッドを停止する方法を教えてください。

前もって感謝します 。。。。

4

2 に答える 2

0

あなたのスレッドはほとんどの時間をで過ごしThread.sleep()ます。これは役に立ちます。スレッドポインタ、t1はクラスメンバーであり、これも役立ちます。t1ボタンハンドラーから、まだ生きているかどうかを確認し、生きている場合は、を呼び出すことができますt1.interrupt();。これにより、スレッドの現在のスリープと将来のスリープがスローされInterruptedExceptionます...この場合、例外ハンドラーを変更してスレッドを終了する必要があります。

于 2012-08-21T11:46:34.847 に答える
0

別の答えがあります。同じことを試すことができます。実行可能なループ内では、常にrun_flagとしてフラグをチェックし、メンバー変数として作成し、ループを開始したらtrueに設定します。完了したら、run_flagをfalseに設定できます。同時に、スレッドにnullを設定することもできます...実行可能なループとスレッドを介して出てくるより安全な方法。

try{
        t1 = new Thread() 
        {
            public void run() {
                while (progressBarStatus < 100 && run_flag == true) { // added run_flag here

                    // process some tasks
                    progressBarStatus = doSomeTasks();

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    // Update the progress bar
                    progressBarHandler.post(new Runnable() {
                        public void run() {
                            linProgressBar.setProgress(progressBarStatus);
                        }
                    });
                }

                if (progressBarStatus >= 100) {

                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) 
                    {
                        e.printStackTrace();
                    }

                }
            }
        };

        t1.start();

    }catch (Exception e) {

    }
于 2012-08-21T11:59:44.197 に答える