Android 什么是我的应用程序正在强制关闭?线程有一些错误。但是我';我想不出来了? 公共类MainActivity扩展活动{ 专用按钮启动、复位、停止; 私人编辑文本秒表,lblDate,lblTime; 公共活动(){ init(); } private final UpdateLockThread ucThread=新UpdateLockThread(); 私有最终StopwatchThread swThread=新StopwatchThread(); @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 开始=(按钮)findViewById(R.id.button1); 停止=(按钮)findViewById(R.id.button3); 重置=(按钮)findViewById(R.id.button2); stop_watch=(EditText)findViewById(R.id.editText3); lblTime=(EditText)findViewById(R.id.editText2); lblDate=(EditText)findViewById(R.id.editText1); Start.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { startactionPerformed(); } }); Stop.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { stopactionPerformed(); } }); Reset.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { resetactionPerformed(); } }); } 公共void init(){ setDaemon(true); setDaemon(true); swThread.start(); ucThread.start(); } /**收听开始/停止/恢复按钮*/ void startactionPerformed(){ swThread.go(); //init(); } void stopactionPerformed(){ swThread.noGo(); } void resetactionPerformed(){ swThread.reset(); } /**更新当前日期和时间的线程*/ 私有类UpdateLockThread扩展线程{ /**线程的实际工作*/ 公开募捐{ while(true){ lblTime.setText(“ampm”); Calendar now=Calendar.getInstance(); 字符串month=Integer.toString(now.get(Calendar.month)+1); String date=Integer.toString(now.get(Calendar.DAY/u/u MONTH)); 字符串year=Integer.toString(now.get(Calendar.year)); 字符串hour=Integer.toString(now.get(Calendar.hour)); 如果(小时等于(“0”)小时=“12”; 字符串minute=Integer.toString(now.get(Calendar.minute)); 如果(分钟长度()==1)分钟=“0”+分钟; String second=Integer.toString(now.get(Calendar.second)); 如果(second.length()==1)second=“0”+秒; 字符串ampm=now.get(Calendar.AM\u PM)==Calendar.AM?“AM”:“PM”; lblDate.setText(月+“/”+日期+“/”+年); lblTime.setText(小时+“:“+分钟+”:“+秒+”+ampm); 试一试{ 睡眠(500); }捕获(中断异常e){} } } } /**跟踪秒表和更新的线程 *相应地,显示器也会显示。 */ 类StopwatchThread扩展线程{ /**秒表是否在运行*/ 私有布尔值=false; /**存储以前运行的已用毫秒数*/ 私用长时间=0; /**存储此运行的开始时间*/ 私有日期开始日期=新日期(); /**返回以毫秒为单位的已用时间。 *@返回经过的时间 */ 私有长延时(){ 返回Previoused+(正在进行?新日期().getTime()-startDate.getTime():0); } /**将已用毫秒数更改为字符串。 *@参数时间已用毫秒数 *@以字符串形式返回经过的时间。 */ 私有字符串msToString(长时间){ 字符串ms,sec,min; if(时间%10>=5)//四舍五入到最接近的百分之一 时间+=5; ms=长时间串(时间%1000); while(ms.length()
什么是我的应用程序正在强制关闭?线程有一些错误。但我没办法弄明白?尝试在Android 什么是我的应用程序正在强制关闭?线程有一些错误。但是我';我想不出来了? 公共类MainActivity扩展活动{ 专用按钮启动、复位、停止; 私人编辑文本秒表,lblDate,lblTime; 公共活动(){ init(); } private final UpdateLockThread ucThread=新UpdateLockThread(); 私有最终StopwatchThread swThread=新StopwatchThread(); @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 开始=(按钮)findViewById(R.id.button1); 停止=(按钮)findViewById(R.id.button3); 重置=(按钮)findViewById(R.id.button2); stop_watch=(EditText)findViewById(R.id.editText3); lblTime=(EditText)findViewById(R.id.editText2); lblDate=(EditText)findViewById(R.id.editText1); Start.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { startactionPerformed(); } }); Stop.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { stopactionPerformed(); } }); Reset.setOnClickListener(新视图.OnClickListener() { 公共void onClick(视图v) { resetactionPerformed(); } }); } 公共void init(){ setDaemon(true); setDaemon(true); swThread.start(); ucThread.start(); } /**收听开始/停止/恢复按钮*/ void startactionPerformed(){ swThread.go(); //init(); } void stopactionPerformed(){ swThread.noGo(); } void resetactionPerformed(){ swThread.reset(); } /**更新当前日期和时间的线程*/ 私有类UpdateLockThread扩展线程{ /**线程的实际工作*/ 公开募捐{ while(true){ lblTime.setText(“ampm”); Calendar now=Calendar.getInstance(); 字符串month=Integer.toString(now.get(Calendar.month)+1); String date=Integer.toString(now.get(Calendar.DAY/u/u MONTH)); 字符串year=Integer.toString(now.get(Calendar.year)); 字符串hour=Integer.toString(now.get(Calendar.hour)); 如果(小时等于(“0”)小时=“12”; 字符串minute=Integer.toString(now.get(Calendar.minute)); 如果(分钟长度()==1)分钟=“0”+分钟; String second=Integer.toString(now.get(Calendar.second)); 如果(second.length()==1)second=“0”+秒; 字符串ampm=now.get(Calendar.AM\u PM)==Calendar.AM?“AM”:“PM”; lblDate.setText(月+“/”+日期+“/”+年); lblTime.setText(小时+“:“+分钟+”:“+秒+”+ampm); 试一试{ 睡眠(500); }捕获(中断异常e){} } } } /**跟踪秒表和更新的线程 *相应地,显示器也会显示。 */ 类StopwatchThread扩展线程{ /**秒表是否在运行*/ 私有布尔值=false; /**存储以前运行的已用毫秒数*/ 私用长时间=0; /**存储此运行的开始时间*/ 私有日期开始日期=新日期(); /**返回以毫秒为单位的已用时间。 *@返回经过的时间 */ 私有长延时(){ 返回Previoused+(正在进行?新日期().getTime()-startDate.getTime():0); } /**将已用毫秒数更改为字符串。 *@参数时间已用毫秒数 *@以字符串形式返回经过的时间。 */ 私有字符串msToString(长时间){ 字符串ms,sec,min; if(时间%10>=5)//四舍五入到最接近的百分之一 时间+=5; ms=长时间串(时间%1000); while(ms.length(),android,Android,什么是我的应用程序正在强制关闭?线程有一些错误。但我没办法弄明白?尝试在runOnUiThread活动方法中通过线程与UI进行所有交互 编辑 public class MainActivity extends Activity { private Button Start, Reset, Stop; private EditText stop_watch, lblDate, lblTime; public MainActivity() { init()
runOnUiThread
活动方法中通过线程与UI进行所有交互
编辑
public class MainActivity extends Activity {
private Button Start, Reset, Stop;
private EditText stop_watch, lblDate, lblTime;
public MainActivity() {
init();
}
private final UpdateClockThread ucThread = new UpdateClockThread();
private final StopwatchThread swThread = new StopwatchThread();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Start = (Button)findViewById(R.id.button1);
Stop = (Button)findViewById(R.id.button3);
Reset = (Button)findViewById(R.id.button2);
stop_watch = (EditText)findViewById(R.id.editText3);
lblTime = (EditText)findViewById(R.id.editText2);
lblDate = (EditText)findViewById(R.id.editText1);
Start.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
startactionPerformed();
}
});
Stop.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
stopactionPerformed();
}
});
Reset.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
resetactionPerformed();
}
});
}
public void init() {
swThread.setDaemon(true);
ucThread.setDaemon(true);
swThread.start();
ucThread.start();
}
/** Listens to the Start/Stop/Resume button. */
void startactionPerformed() {
swThread.go();
//init();
}
void stopactionPerformed() {
swThread.noGo();
}
void resetactionPerformed() {
swThread.reset();
}
/** A thread that updates the current date & time. */
private class UpdateClockThread extends Thread {
/** The actual work of the thread. */
public void run() {
while (true) {
lblTime.setText("ampm");
Calendar now = Calendar.getInstance();
String month = Integer.toString(now.get(Calendar.MONTH)+1);
String date = Integer.toString(now.get(Calendar.DAY_OF_MONTH));
String year = Integer.toString(now.get(Calendar.YEAR));
String hour = Integer.toString(now.get(Calendar.HOUR));
if (hour.equals("0")) hour = "12";
String minute = Integer.toString(now.get(Calendar.MINUTE));
if (minute.length() == 1) minute = "0" + minute;
String second = Integer.toString(now.get(Calendar.SECOND));
if (second.length() == 1) second = "0" + second;
String ampm = now.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM";
lblDate.setText(month + "/" + date + "/" + year);
lblTime.setText(hour + ":" + minute + ":" + second + " " + ampm);
try {
sleep(500);
} catch (InterruptedException e) {}
}
}
}
/** A thread that keeps track of the stop watch & updates
* the display accordingly.
*/
class StopwatchThread extends Thread {
/** Whether or not stop watch is running. */
private boolean going = false;
/** Stores elapsed milliseconds of previous runs. */
private long prevElapsed = 0;
/** Stores beginning time of this run. */
private Date startDate = new Date();
/** Returns elapsed time in milliseconds.
*@return The elapsed time
*/
private long elapsedTime() {
return prevElapsed + (going ? new Date().getTime() - startDate.getTime() : 0);
}
/** Changes the number of elapsed milliseconds into a string.
*@param time Number of elapsed milliseconds
*@return The elapsed time as a string.
*/
private String msToString(long time) {
String ms, sec, min;
if (time % 10 >= 5) //round to nearest hundredth
time += 5;
ms = Long.toString(time % 1000);
while (ms.length() < 3)
ms = "0" + ms;
ms = ms.substring(0, ms.length() - 1);
time /= 1000;
sec = Long.toString(time % 60);
if (sec.length() == 1) sec = "0" + sec;
time /= 60;
min = Long.toString(time);
return min + ":" + sec + "." + ms;
}
/** Called when the stop watch is to go.
*/
public void go() {
startDate = new Date();
going = true;
}
/** Called when the stop watch is to stop.
*/
public void noGo() {
prevElapsed = elapsedTime();
going = false;
}
/** Resets the stop watch.
*/
public void reset() {
going = false;
prevElapsed = 0;
}
/** Adds a lap to the list.
*/
/** Main code of the thread.
*/
public void run() {
while (true) {
stop_watch.setText(msToString(elapsedTime()));
yield();
}
}
}
}
您应该在开发人员机器上运行adb logcat。通常,如果您获得强制关闭,日志中将显示回溯。您的类
秒表线程包含以下行:
private class UpdateClockThread extends Thread {
public void run() {
/* Do somthing expensive */
......
/* Update UI */
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
/* Do UI update */;
lblTime.setText("ampm");
......
}
});
}
}
这将不起作用,而且UpdateClockThread
中的UI更新也不会起作用。这是因为您无法从后台线程修改UI。你的背景
stop_watch.setText(msToString(elapsedTime()));