2

我有一个以下计时器实现。我想在里面使用它,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();
4

1 回答 1

0

一种选择就是使用

postDelayed(Runnable r, long milliseconds)

在不使用服务的情况下,无论您的更新周期是什么,都可以触发您的可运行更新方法。然后在您的更新方法中更新 UI。

如果您打算在后台执行某些操作,则另一种选择是使用 AsyncTask 而不是 Service。AsyncTask 可以通过它的方法访问 UI 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"or "set chrono to " + x + "milli"

于 2014-01-13T12:18:49.487 回答