我的应用程序停止响应

问题描述:

因此,只要我在我的设备上启动我的应用程序,它运行良好,但是当我按下按钮时,它什么也不做,除非保持高调,然后弹出说它没有响应这里是代码。我认为它是我在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; 
    } 
} 

}

任何在onclick方法运行在UI线程上。您的while循环挂起应用程序,操作系统(正确)强制停止。

研究使用AsyncTask从UI线程获取代码。您应该在每次循环迭代后暂停以避免不必要的CPU使用。

您的while将基本上永远在主UI线程上循环,直到您的TimePicker的小时/分钟与当前时间匹配。这就是从操作系统引起的ANR消息。

您不应该在UI线程上运行长操作。使用线程或处理程序或AsyncTasks来实现您想要的结果。

你试过检查logcat吗?