2012-07-15 3 views
0

Так что всякий раз, когда я запускаю свое приложение на своих устройствах, он работает нормально, но когда я нажимаю кнопку, он ничего не делает, кроме того, остается сильным, а затем всплывает, заявив, что не отвечает здесь код. Я думаю, что у меня есть код в OnClickListerner. пакет com.dicamillo.alarm;Мое приложение перестает отвечать

import java.util.Calendar; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.DigitalClock; 
import android.widget.TimePicker; 

public class AlarmlockActivity extends Activity implements OnClickListener { 
    /** Called when the activity is first created. */ 
    TimePicker tp; 
    Button set; 
    int hour; 
    int minuet; 
    DigitalClock dc; 
    Calendar calendar = Calendar.getInstance(); 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tp = (TimePicker) findViewById(R.id.tpAlarmTime); 
    set = (Button) findViewById(R.id.bSet); 
    dc = (DigitalClock) findViewById(R.id.digitalClock1); 
    hour = calendar.get(Calendar.HOUR); 
    minuet = calendar.get(Calendar.MINUTE); 
    set.setOnClickListener(this); 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.bSet: 
     while (tp.getCurrentHour().intValue() != hour 
       && tp.getCurrentMinute().intValue() != minuet) { 
      tp.getCurrentHour().intValue(); 
      tp.getCurrentMinute().intValue(); 
      if (tp.getCurrentHour().intValue() == hour 
        && tp.getCurrentMinute().intValue() == minuet) { 
       MediaPlayer mp = MediaPlayer.create(AlarmlockActivity.this, 
         R.raw.alarm); 
      } 
     } 
     break; 
    } 
} 

}

ответ

2

Все, что в методе OnClick работает в потоке пользовательского интерфейса. Ваш цикл while висит в приложении, и ОС (по праву) вынуждает его остановиться.

Обратите внимание на использование AsyncTask, чтобы получить код с линии пользовательского интерфейса. Вы также должны сделать паузу после каждой итерации цикла, чтобы избежать ненужного использования ЦП.

0

Ваш while будет в основном зацикливаться на главном потоке пользовательского интерфейса, пока час/минута с вашего TimePicker не совпадет с текущим временем. Вот что вызывает сообщение ANR из ОС.

Вы не должны запускать длинные операции с потоком пользовательского интерфейса. Для достижения желаемого результата используйте Threads или Handlers или AsyncTasks.

0

Вы пытались проверить логарифм ?!

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