0

私はこのコードを持っています:

package org.example.Threading;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ThreadingActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */

    private doinback background = new doinback();
    Handler handle= new Handler(){
    @Override
    public void handleMessage(Message msg) {
        Log.e("INSIDE HANDLER", "About to stop the thread.");
        background.stopThread();
        }};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        Log.e("ONCREATE", "BEFORE Thread");
        background.start();
        Log.e("ONCREATE", "AFTER Thread started");

        View button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(this);
    }

    class doinback extends Thread{
        private volatile boolean isRunning = false;
        public void run() {
            while(isRunning){
                Log.e("INSIDE THREAD", "about to sleep");
                handle.sendMessage(handle.obtainMessage());
            }

        }
        public void stopThread()
        {
            isRunning = false;
        }
        public void startThread(){
            Log.e("INSIDE StartThread","MAKING isRunning True");
            isRunning = true;
        }
        }
    public void onClick(View v) {
        background.startThread();
        Log.e("INSIDE ONCLICK", "made isRunning true, about to leave");

    }
}

なぜスレッドに戻らないのかを理解しようとしています。何か間違っている場合は、たとえばstopThread()関数を使用して、スレッドを行き来するための最良の方法は何ですか。スレッドの実行を停止するwhile変数の値。コードを実行してボタンを押すと、スレッドが開始されません。なぜ何かアイデアはありますか?

4

1 に答える 1

0

background.start()が呼び出された場合、isRunningはまだfalseであるため、スレッドは開始され(ただし、whileループには入りませんでした)、すぐに停止します。

が呼び出されたときにスレッドがwhileループに入るのを確実にするために、メソッドstartThreadに次のコードを入れることができます。startThread()

public void startThread(){
    isRunning = true;
    start();
}

background.start()そして、あなたは電話をかけませんonCreate()、ただその行を削除してください。

編集

単一のスレッドを存続させたい場合は、スレッドを「開始」して「停止」することができ、次のコードを使用できます。

public void run () {
    while (isRunning) {
        if(!isWorking) {
            try { Thread.sleep(10); } catch (InterruptedException ex) { }
            continue;
        }
        //.. do your work here.
    }
}

スレッドの実行状態は。で制御し、動作状態は。で制御isRunningisWorkingます。

于 2012-05-14T01:09:25.447 に答える