Java android已经有秒表类了吗?为什么';这不是我的执行工作吗?
最近,我看到并想知道是否有一个各自的秒表类,因为我想告诉我的应用程序的用户,他已经尝试解决了多久的难题。我的意思是,你自己编写这样一个秒表并没有那么复杂。我试过类似的东西Java android已经有秒表类了吗?为什么';这不是我的执行工作吗?,java,android,timer,runnable,stopwatch,Java,Android,Timer,Runnable,Stopwatch,最近,我看到并想知道是否有一个各自的秒表类,因为我想告诉我的应用程序的用户,他已经尝试解决了多久的难题。我的意思是,你自己编写这样一个秒表并没有那么复杂。我试过类似的东西 Runnable runnable = new Runnable() { @Override public void run() { while (true) { try { Thread.s
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
long seconds = (System.currentTimeMillis() - t) / 1000;
statusBar.setText(String.format("%02d:%02d", seconds / 60, seconds % 60));
}
}
};
statusBar.post(runnable);
但奇怪的是,我的活动布局不再膨胀,因为我有了这个
statusBar.post(runnable)onCreate
方法的末尾是code>,这意味着启动应用程序后,我只看到一个白色屏幕,而不是正常的gui。您的代码无法工作的原因是您向UI线程消息队列发布了Runnable
。runnable永远在while
循环中运行,阻止UI线程执行任何其他业务,例如绘制布局和响应输入
在UI线程中使用
Thread.sleep()
几乎总是错误的。考虑使用<代码>定时器< /代码>。 < P>你应该使用计时表。
但无论如何,如果您从UI线程中移除睡眠,代码可以工作
private final Runnable mRunnable = new Runnable() {
@Override
public void run() {
if (mStarted) {
long seconds = (System.currentTimeMillis() - t) / 1000;
statusBar.setText(String.format("%02d:%02d", seconds / 60, seconds % 60));
handler.postDelayed(runnable, 1000L);
}
}
};
private Hanlder mHandler;
private boolean mStarted;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
}
@Override
protected void onStart() {
super.onStart();
mStarted = true;
mHandler.postDealyed(runnable, 1000L);
}
@Override
protected void onStop() {
super.onStop();
mStarted = false;
mHandler.removeCallbacks(mRunnable);
}
看看这门课
APIDemo中的示例代码:
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
public class ChronometerDemo extends Activity {
Chronometer mChronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chronometer);
Button button;
mChronometer = (Chronometer) findViewById(R.id.chronometer);
// Watch for button clicks.
button = (Button) findViewById(R.id.start);
button.setOnClickListener(mStartListener);
button = (Button) findViewById(R.id.stop);
button.setOnClickListener(mStopListener);
button = (Button) findViewById(R.id.reset);
button.setOnClickListener(mResetListener);
button = (Button) findViewById(R.id.set_format);
button.setOnClickListener(mSetFormatListener);
button = (Button) findViewById(R.id.clear_format);
button.setOnClickListener(mClearFormatListener);
}
View.OnClickListener mStartListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.start();
}
};
View.OnClickListener mStopListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.stop();
}
};
View.OnClickListener mResetListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.setBase(SystemClock.elapsedRealtime());
}
};
View.OnClickListener mSetFormatListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.setFormat("Formatted time (%s)");
}
};
View.OnClickListener mClearFormatListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.setFormat(null);
}
};
}
R.测时计:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Chronometer android:id="@+id/chronometer"
android:format="@string/chronometer_initial_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="30dip"
android:paddingTop="30dip"
/>
<Button android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chronometer_start">
<requestFocus />
</Button>
<Button android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chronometer_stop">
</Button>
<Button android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chronometer_reset">
</Button>
<Button android:id="@+id/set_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chronometer_set_format">
</Button>
<Button android:id="@+id/clear_format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/chronometer_clear_format">
</Button>
</LinearLayout>
将此添加到Strings.xml
<string name="chronometer_start">Start</string>
<string name="chronometer_stop">Stop</string>
<string name="chronometer_reset">Reset</string>
<string name="chronometer_set_format">Set format string</string>
<string name="chronometer_clear_format">Clear format string</string>
<string name="chronometer_initial_format">Initial format: <xliff:g id="initial-format">%s</xliff:g></string>
开始
停止
重置
设置格式字符串
清除格式字符串
初始格式:%s
您应该使用
当我们停止计时时
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
在开始计时之前先检查一下计时器
mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();
重置计时器
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
正确的做法是使用计时器。你不能休眠主线程。如果您在其他线程中运行此代码,您将需要一个处理程序来写入UI(只有主线程可以更改UI)。如果您还发布了UI屏幕截图,不是更好吗:)字符串计时器\u初始\u格式丢失,你能不能把它添加到同一个答案中,这样我们就不用去谷歌看格式了?@Ammaraly只有OP知道,我首先修改了他的代码。计时器不支持秒表需要的暂停和恢复。