使用具有计时器的服务更新视图

时间:2012-07-11 12:11:58

标签: android android-service textview android-view

我不确定这是否是正确的方法,但我会尝试解释我想要做的事情。

我有一个Activity,会创建一个名为fragment的{​​{1}}标签。我想要做的是创建并启动一个TemporaryFragment的服务,然后Timer更新Timer中的时间。

我想要去的方式是某种方式,当TextView开始时,将ServiceTextView传递到Activity然后传递{{1}保持对它的引用。

另一种可能的方法是让Service成为Service的监听者,然后在Activity中调用方法来更新Service

任何想法都会很棒,也许还有一些选择。

提前致谢。

ADDITION 对不起,我还应该指明我需要这个计时器才能在后台运行。因此,当应用程序被发送到后台时,我需要定时器继续进行,并且只在我告诉它时停止。

4 个答案:

答案 0 :(得分:0)

我会使用一个更简单的方法:

public class MainActivity extends Activity implements Callback {
    private static final int MSG_UPDATE = 1;
    private static final long INTERVAL = 1000; // in ms

    private final Handler handler = new Handler(this);
    private Thread worker;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_UPDATE:
                updateView();
                return true;
        }
        return false;
    }

    private void updateView() {
        // TODO tbd
    }

    @Override
    protected void onStart() {
        super.onStart();
        // start background thread
        worker = new Thread(new Runnable() {
            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    try {
                        Thread.sleep(INTERVAL);
                    } catch (InterruptedException e) {
                        break;
                    }
                    // send message to activity thread
                    handler.sendEmptyMessage(MSG_UPDATE);
                }
            }
        });
        worker.start();
    }

    @Override
    protected void onStop() {
        super.onStop();
        // stop background thread
        worker.interrupt();
        try {
            worker.join();
        } catch (InterruptedException e) {
        }
        worker = null;
    }
}

答案 1 :(得分:0)

您可以使用TimerTask类。覆盖TimerTask.run()方法,然后将TimerTask添加到Timer类。

另请查看此问题:controlling a task with timer and timertask

答案 2 :(得分:0)

服务不适合像这样的小任务,而且,服务可以独立于活动运行。如果您正在考虑移动应用程序的术语,那么产生新线程或使用将新线程引入应用程序的计时器对于这个相对较小的原因并不理想。

而是在片段中使用Handler

在片段中创建处理程序

private Handler mHandler = new Handler();

执行您定义的任务调用

mHandler.postDelayed(mUpdateTask, 1000);

mHandler.post(mUpdateTask);

并在片段中定义您的任务

private Runnable mUpdateTask = new Runnable() {
    public void run() {
        Toast.makeText(getActivity(), "hello world", Toast.LENGTH_SHORT).show();
        mHandler.postDelayed(this, 1000);
    }
};

如果您要显示类似时间的信息而不是倒计时信息,请使用

mHandler.removeCallbacks(mUpdateTimeTask);

onPause()方法中停止执行您的任务,如果活动不可见,因为更新用户界面不相关且节省了电池(您在onResume()方法中再次启动任务)

答案 3 :(得分:0)

  

基本上,计时器背后的想法最终我将在我的应用程序中添加一些跟踪,因此即使应用程序不在前台也需要它继续运行 - Disco S2

根据此评论,我建议您使用位于后台的local service,执行此操作(从Service#onStart启动一个帖子),直到它被stopService(..)停止。

另一方面,活动可以绑定和取消绑定到该服务(请参阅:bindService(..))以获得有关更新的通知或以任何方式与服务进行通信。