2011-02-01 2 views
0

я получил ответы на некоторые вопросы, и пошла вперед и попытались следующее:все еще возникают проблемы окончания нити

01 import android.app.Activity; 
02 import android.media.MediaPlayer; 
03 import android.os.Bundle; 
04 import android.os.Handler; 
05 import android.os.Message; 
06 import android.media.MediaPlayer; 
07 import android.media.AudioManager; 
08 import android.content.Context; 
09 import java.lang.Runnable; 
10 
11 public class CanvasDrawingActivity extends Activity { 
12  
13  private static final int FIRE = 0; 
14  private int initVolume = 0; 
15  private Handler handler; 
16  private MyCanvas v; 
17  private MediaPlayer mp; 
18  private AudioManager am; 
19  private MyRunnable r;// this is our custom runnable! 
20 
21  @Override 
22  public void onCreate(Bundle savedInstanceState) { 
23   super.onCreate(savedInstanceState); 
24   
25   am = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
26    
27    // this method gets the current volume setting for music 
28    initVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC); 
29    
30    // this method sets the volume for music | the 100 is the volume. you can put there either initVolume or whatever value you want 
31    am.setStreamVolume(AudioManager.STREAM_MUSIC,100,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
32   
33   mp = MediaPlayer.create(this, R.raw.siren_1); 
34   
35   makeHandler(); 
36   v =new MyCanvas(this); 
37   setContentView(v); 
38   r = new MyRunnable();// this needs to create a new MyRunnable 
39   new Thread(r).start(); 
40   mp.setLooping(true); 
41   mp.start(); 
42  } 
43  private void makeHandler() 
44  { 
45   handler = new Handler(){ 
46 
47    @Override 
48    public void handleMessage(Message msg) { 
49     switch(msg.what) 
50     { 
51     case FIRE: 
52     { 
53      v.invalidate(); 
54      break; 
55     } 
56     } 
57    } 
58    
59   }; 
60   
61  } 
62  private class MyRunnable extends Runnable {// you had this in the wrong spot... 
63    private boolean doRun = true; 
64    
65    @Override 
66    public void run(){ 
67    while(doRun) 
68     handler.sendEmptyMessage(FIRE); 
69     } 
70   public void stopThread(){ 
71    doRun = false; 
72   } 
73  } 
74  protected void onpause() { 
75   super.onpause(); 
76   mp.stop(); 
77   r.stopThread(); 
78   finish(); 
79  } 
80  protected void onfinish() { 
81   mp.stop(); 
82   r.stopThread(); 
83   finish(); 
84  } 
85   
86  } 

Я получаю сообщение об ошибке, что работоспособные не может быть суперклассом. В частности, что тип runnable не может быть суперклассом MyRunnable; суперкласс должен быть классом.

Затем в onpause и onfinish появляется сообщение об ошибке: Te метод stopThread не определен для типа runnable. Это происходит даже тогда, когда extends изменяется на инструменты.

Я также попытался:

01 Runnable MyRunnable = new Runnable(){ 
02   
03   
04   private boolean doRun = true; 
05   
06   @Override 
07   public void run(){ 
08    while(doRun) 
09     handler.sendEmptyMessage(FIRE); 
10   } 
11   public void stopThread(){ 
12    doRun = false; 
13   } 
14  } 

Я попытался также:

private class MyRunnable implements Runnable \\etc 

что проясняет работоспособный проблему, но вызывает мой

r = new MyRunnable(); 

и

r.stopThread(); 

быть ошибками, которые говорят еще: stopThread is undefined for the type runnable, and Type mismatch cannot convert from CanvasDrawingActivity.MyRunnable to Runnable.

Может кто-нибудь помочь мне здесь. Я чувствую, что это хороший вариант, чтобы закончить поток, но опять-таки, я получаю непроходимые ошибки ...

+0

Вы уверены, что его onpause или [onPause()] (http://developer.android.com/reference/android/app/Activity.html#onPause()) также относятся к [this] (http: // stackoverflow.com/questions/1204012/why-isnt-the-thread-stopping) – Reno

+0

По какой-то причине ему нравится делать эти строчные буквы. Это onPause(), но форматирование изменилось. – user571866

ответ

1

Когда вы используете анонимный класс, единственными методами, с которыми вы можете обращаться извне самого класса, являются те, которые объявлены в его супертип. В вашем случае любой код вне класса может вызывать только метод run(), поскольку это все, что определено для Runnable. Решение состоит в том, чтобы объявить явный класс, который вы пытались сделать с MyRunnable.

Сообщения об ошибках, однако, свидетельствуют о том, что вы не поняли это совершенно правильно. В частности, ошибка «несоответствие типа» говорит о том, что MyRunnable не реализует Runnable. Это сообщение должно происходить из кода, отличного от того, что вы опубликовали. Кроме того, по-видимому, любой объект, который вы пытаетесь использовать для вызова stopThread, известен компилятору в этот момент только как Runnable, а не MyRunnable.

Отдельное примечание, как только вы пройдете ошибки компилятора, вы не будете довольны тем, как это работает. Вы будете отправлять пустые сообщения FIRE так быстро, как процессор может их создать. Вам нужно немного замедлить это, возможно, вызвав Thread.sleep() с соответствующей задержкой.

+0

Я объявил r, который я использую для runnable как: private MyRunnable r; Поэтому он должен регистрироваться как myRunnable, но этого не делать. Я не знаю, почему. Что касается добавления Thread.sleep, это что-то вроде Thread.sleep (incriment) или: thread.sleep (2000), чтобы заставить его замедлить работу. Я использую это, чтобы чередовать цвет на экране, который я хочу вспыхнуть довольно быстро, но не безумно так. Я ценю помощь и более глубокое понимание. – user571866

+0

Хотелось бы еще услышать ваше мнение о thread.sleep и о том, как использовать его соответствующим образом. Я бы хотел, чтобы это отлично справилось с воротами. – user571866

+0

Thread.sleep (35) остановит цикл на 35 миллисекунд. Это около 30 кадров в секунду, что примерно на пределе того, что может наблюдать глаз. Многие анимации очень хорошо работают с 10 кадрами в секунду или 100 мсек между кадрами. Если вы мигаете цветом, то каждые пару секунд должно быть хорошо. Вам необходимо окружить вызов спать с помощью блока try/catch для InterruptedException. Это поднимается, если прерывание() вызывается в спящем потоке. –

0

Следующая компилируется нормально для меня:

private MyRunnable r; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    r = new MyRunnable();// this needs to create a new MyRunnable 
} 
private class MyRunnable implements Runnable { 

    private boolean doRun = true; 
    @Override 
    public void run() { 
     // do stuff 
    } 
    public void stopThread(){ 
     doRun = false; 
    } 
} 
@Override 
protected void onPause(){ 
    r.stopThread(); 
} 
@Override 
protected void onDestroy() { 
    r.stopThread(); 
} 

Вы должны иметь в виду комментарии @Ted Хопп в отношении исполнения этого решения.

+0

Спасибо, что опубликовали это. Это практически идентично тому, что у меня есть в моем текущем коде. Проблема в том, что я получаю это: stopThread не определен для типа runnable, а Type mismatch не может преобразовать из CanvasDrawingActivity.MyRunnable в Runnable. Я не уверен, почему моя не компилируется ... – user571866

+0

Я перестроил размещение нескольких моих объявлений и POOF, сработал! Я не знаю почему, они должны были работать там, где они были, но эй, мы заняты бизнесом. Спасибо за поддержку! – user571866

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