Android:在服务中的timertask更新GUI

时间:2013-05-19 23:19:06

标签: java android

Hello社区,

我已经查看了有关我的问题的论坛,但我不知道如何使用处理程序。

我的问题:
GUI具有文本字段。我创建了一个服务,它的工作原理。该服务将更新UI。

我有什么:

  • Android Galaxy S Handy
  • Indigo Service Release 2

我的编码:

public class SamsungLoc1 extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_samsung_loc1);

    buttonStart = (Button) findViewById(R.id.buttonStart);
        buttonStop = (Button) findViewById(R.id.buttonStop);

        buttonStart.setOnClickListener(this);
        buttonStop.setOnClickListener(this);

        TextView tv1 = (TextView) findViewById(R.id.TextView01);
        tv1.setText("initial1");
    }

    public void onClick(View src) {
        switch (src.getId()) {
        case R.id.buttonStart:
          startService(new Intent(this, MyService.class));
          break;
        case R.id.buttonStop:
          Log.d(TAG, "onClick: stopping srvice");
          break;
        }
      } 
}   

因此,当单击开始按钮时,服务MyService.class启动:

public class MyService extends Service {
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
    }

    @Override
    public void onDestroy() {
    }

    @Override
    public void onStart(Intent intent, int startid) {
          Timer t = new Timer();
            t.scheduleAtFixedRate(new TimerTask() {
//              @Override
                public void run() {

//Here I would like to change the textview of the UI

                            tv1.setText("New Information");



                }                    
           },0,300000);     
    }
}

好吧,我已经读过我必须使用处理程序,但我不知道如何使用它。请取悦请:-)给我一个代码剪断如何在服务的时间范围内更改textview tv1?

请问,
安迪

1 个答案:

答案 0 :(得分:1)

  

服务应更新UI

不,它不会。

服务应该做一些事情让您的应用的UI层知道在后台发生的某些事件。请记住,如果用户按下了BACK或HOME或其他内容,那么前景中可能没有 您的应用的UI层。

而且,如果您对此的回答“很好,我将在这些情况下停止服务”,那么您不需要服务,应该摆脱它。服务背后的是能够独立于UI层运行的,用于纯后台工作。

  

服务MyService.class启动

onStart()已弃用大约四年。请了解现代 Android应用开发。使用onStartCommand(),而不是onStart()

  

我已经读过我必须使用处理程序

虽然这是一种选择,但它不是我的首选。或者我的第二选择。或者我的第三选择。

我个人的首选是使用第三方消息总线,例如Otto。我没有方便的样本奥托应用程序,因为我的书中还没有涉及到这一点(虽然它在我的待办事项列表中很高......)。

我的第二选择是使用LocalBroadcastManagerLocalBroadcastManager的优势在于它位于Android支持包中(您可能已经在使用它),它的工作原理与常规系统广播(您可能已经有过)相似。 Here is a sample project使用LocalBroadcastManager

我的第三个选择是使用实际的系统广播,服务调用sendBroadcast(),当您的活动位于前台时,您的活动已注册BroadcastReceiver。如果活动位于前台,则可能需要更新活动,否则显示Notification,如this sample app所示。它还可用于允许第三方应用程序查找您的事件,前两个解决方案排除这些事件。

虽然有些情况下直接使用Handler是一个好主意,但我想不出任何与Android新手相关的内容。