0

.

你好社区,

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

我的问题:
GUI 有一个文本字段。我创建了一个服务,它可以工作。该服务应更新 UI。

我有的:

  • 安卓 Galaxy S Handy
  • Indigo 服务版本 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);     
    }
}

好吧,我已经读到我必须使用处理程序,但我不知道如何使用它。可以请:-)给我一个代码,如何在服务的timertask中更改textview tv1?

亲切的问候,
安迪

4

1 回答 1

1

该服务应更新 UI

不,不应该。

该服务应该做一些事情来让你的应用程序的 UI 层知道在后台发生的一些事件。请记住,如果用户按下了 BACK 或 HOME 或其他键,前台可能没有应用程序的 UI 层。

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

服务 MyService.class 启动

onStart()已被弃用大约四年。请学习现代Android 应用程序开发。使用onStartCommand(),不使用onStart()

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

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

我个人的首选是使用第三方消息总线,例如Otto。我手头没有 Otto 应用程序示例,因为我还没有在我的书中介绍过这个(尽管它在我的待办事项列表中很重要......)。

我的第二个选择是使用LocalBroadcastManager. 其优点LocalBroadcastManager是它位于 Android 支持包中(您可能已经在使用它),并且它的工作方式很像常规系统广播(您可能已经有经验)。这是一个使用LocalBroadcastManager.

我的第三个选择是使用实际的系统广播,您的服务调用并且您的活动在前台时sendBroadcast()已注册。BroadcastReceiver这在您可能想要更新处于前台的活动时很有用,否则显示 a Notification,如本示例应用程序所示。它对于允许第三方应用程序了解您的事件也很有用,前两个解决方案排除了这些事件。

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

于 2013-05-19T23:30:26.237 回答