2012-05-14 3 views
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, чтобы остановить запуск потока. Когда я запускаю код и нажимаю кнопку, он не запускает нить. Любые идеи почему?

ответ

0

Когда вызывается background.start(), isRunning по-прежнему является ложным, поэтому поток запускается (но не входит в цикл while) и немедленно останавливается.

Чтобы нить, чтобы войти в то время цикла, когда startThread называется, вы можете поместить следующий код в startThread() метода:

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

И вы не вызываете background.start() в onCreate(), просто удалите эту строку ,

EDIT

Если вы хотите сохранить один поток живой, так что вы можете «запустить» его и «стоп» его столько раз, сколько вы хотите, вы можете использовать следующий код:

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

Вы управляете рабочим состоянием резьбы с помощью isRunning, а рабочее состояние - с isWorking.

+0

Причина, по которой я не хочу ставить старт в startThread, состоит в том, что мне может потребоваться много раз вызывать этот поток, и я начну уже начинать выступление. функция startThread - это просто изменить переменную, чтобы поток снова запустился ... или этого я хочу достичь. Есть ли лучший способ сделать это? В значительной степени похож на тип повторного запуска ... –

+0

@JohnSmith, см. Мой отредактированный ответ. – neevek

+0

Моя главная проблема: почему мой код не делает то, что он должен делать? Например, когда вы запускаете этот код, он не делает того, что он должен делать, почему? Не предполагается ли создать пользовательский интерфейс с кнопкой, и когда я нажму на эту кнопку, он изменит переменную на true, которая должна заставить поток работать ... но поток не работает, почему? –

Смежные вопросы