4

我的用例是,每当用户键入 EditText 时,输入数据都用于在后台执行操作。这些操作可能需要足够长的时间才能导致 ANR。如果操作完成得足够快,@TextChange 和 @Background 可以正常工作。但是操作是否需要足够长的时间,以便用户输入更多数据,我会遇到线程问题,因为会有多个后台任务将命令更新相同的 UI 组件。

我想我用 AsyncTask API 实现了想要的行为,但也想寻找基于 AndroidAnnotations 的解决方案,因为它大大简化了代码。顺便说一句,很棒的库。

下面是一些代码片段,希望能说明我的观点。感谢您至少阅读,感谢评论/答案:)

@TextChange
void onUserInput(...) {
  // This will start a new thread on each text change event
  // thus leading to a situation that the thread finishing
  // last will update the ui
  // the operation time is not fixed so the last event is
  // not necessary the last thread that finished
  doOperation()
}

@Background
void doOperation() {
  // Sleep to simulate long taking operation
  Thread.sleep( 6000 );
  updateUi()
}

@UiThread
void updateUi() {
  // Update text field etc content based on operations
}

更新:目前这是不可能的,请参阅下面的 DayS 的回答。

4

2 回答 2

4

从 AA 3.0 开始就有可能。阅读此线程

@Override
protected void onStop() {
    super.onStop();
    boolean mayInterruptIfRunning = true;
    BackgroundExecutor.cancelAll("longtask", mayInterruptIfRunning);
}

@Background(id="longtask")
public void doSomethingLong() {
    // ...
}
于 2014-02-02T20:30:43.933 回答
1

Android Annotations 上已经有这种请求,但由于没有提出解决方案而被关闭。但是,如果您对此有任何想法,请继续并重新打开此问题 ;)

于 2013-03-13T11:02:15.867 回答