我有一个以下计时器实现。我想在Service
中使用它,然后将其输出发送到我的片段。问题是Service
没有findViewById()
,因为很明显它根本没有View
。有什么方法可以让计时器在Service
内工作,如果没有,我可以使用什么呢?
代码:
Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.setOnChronometerTickListener(
new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
// TODO Auto-generated method stub
long myElapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase();
String strElapsedMillis = String.valueOf(myElapsedMillis);
// Toast.makeText(AndroidChronometer.this, strElapsedMillis, Toast.LENGTH_SHORT).show();
TextView tw5 = (TextView) findViewById(R.id.textView2);
tw5.setText(strElapsedMillis.format("%d min : %d sec",
TimeUnit.MILLISECONDS.toMinutes(myElapsedMillis),
TimeUnit.MILLISECONDS.toSeconds(myElapsedMillis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(myElapsedMillis))));
}
}
);
chronometer.start();
答案 0 :(得分:0)
一种选择就是使用
postDelayed(Runnable r, long milliseconds)
在不使用服务的情况下触发更新周期的可运行更新方法。然后在更新方法中更新UI。
另一种选择是使用AsyncTask而不是Service,如果您打算在后台执行某些操作。 AsyncTask可以通过onProgressUpdate()
方法访问用户界面,你可以在那里做你的工作。
如果您必须使用服务,则必须从服务广播到UI活动,并让UI活动进行视图更新:
这在您的主要活动中:
private StatusReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mReceiver = new StatusReceiver();
...
}
@Override
protected void onStart() {
// Register the broadcast receiver
IntentFilter filter = new IntentFilter();
filter.addAction(getString(R.string.ACTION_UPDATE_CHRONO));
filter.addCategory(Intent.CATEGORY_DEFAULT);
registerReceiver(mReceiver, filter);
...
}
@Override
protected void onStop() {
...
unregisterReceiver(mReceiver);
...
}
public class StatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if( action.equals(getString(R.string.ACTION_UPDATE_CHRONO)) ) {
// Do your UI stuff here
}
}
}
在服务类中:
private void broadcast(String status, Exception error) {
Intent broadcastIntent = new Intent((Intent) getText(R.string.ACTION_UPDATE_CHRONO));
broadcastIntent.putExtra("STATUS", status);
broadcastIntent.putExtra("ERROR", error);
sendBroadcast(broadcastIntent);
}
如果您想要向主要活动传达某些“状态”,请调用此方法,例如"Time for update"
或"set chrono to " + x + "milli"
。