用于防止在GUI线程上进行调用的Android方法注释

时间:2014-12-02 08:52:28

标签: java android multithreading annotations

在我目前正在进行的项目中,有大量的缓存在主线程上完成,这使得应用程序滞后。我的计划是制作这些的异步变体,但仍然保持同步调用,以便在asyncTasks中组合时更容易链接。我有这个问题,我希望以某种直观的方式阻止在GUI线程中使用缓存功能。有任何想法吗?可能吗?是否可以使用注释标记一个方法,以防止在GUI线程上调用它?

3 个答案:

答案 0 :(得分:4)

http://androidannotations.org/提供了一个利用注释来处理这个问题的库。他们有@UiThread@Background等注释,基本上取代了分别使用runOnUiThread()AsyncTask的需要。

如果您有兴趣,请参阅paper讨论类似的系统,以处理从非UI线程阻止UI线程操作。

答案 1 :(得分:0)

据我所知,没有这种可能性。

也许你可以尝试使用"状态机'使用Android.Handlers

<强>结帐

Google Android Communication with UI Thread using Handlers

My favorite ---> Very clean and tidy article about Handlers!

值得在Google浏览器中使用处理程序&#34;状态机进行搜索&#34;太!这样我就找到了解决问题J的方法。

我希望您能找到一些有用的信息。

答案 2 :(得分:0)

我不知道任何注释,但让它异步是一个好主意。就个人而言,我并不真正关心AsyncTask,因为我认为代码变得非常混乱,尤其是当您需要将调用链接在一起等时,就像您提到的那样。

AsyncTask还有其他方法可以提供更简单的链接,错误处理等。例如,您可以使用promises。 JQ是Java7 / Android的promise库,它基本上是JavaScript Promises / A +规范的Java端口。 Promise基本上是Future的扩展,带有可链接的方法,用于使用回调来观察完成。

作为一个例子(取自JQ文档),假设同步代码使用缓慢的阻塞方法foobarbaz

try {
  int x = foo();
  int y = bar(x);
  return baz(y);
} catch (Exception e) {
  return -1;
} finally {
  // Always called
}

可能会成为

return foo().then(x -> {
  return bar(x);
}).then(y -> {
  return baz(y);
}).fail(e -> {
  return Value.wrap(-1);
}).fin({
  // Always called
});

(lambda简写用于减少示例详细程度,实际上你会写then(new OnFulfilledCallback() {...})等,但Android Studio会使这很简单并且在某种程度上也会自动折叠 - 或者你可以使用Retrolambda使用Java7获得Java8风格的lambda语法。)

方法foobarbaz的实现将返回Promise并在工作线程上执行实际工作。您可以自己做好准备,或使用JQ提供的工具轻松创建承诺,并将相关的工作卸载到工作线程:

private Promise<Integer> foo() {
    return JQ.defer(() -> {
        int result = 42;

        // do some heavy processing...
        return result;
    });
}

请注意,JQ还为多个并行操作的同步提供了有用的utilities,为长时间运行的操作添加了超时等等。

免责声明:因为我是JQ的作者,所以有些无耻的推广。 ;)

相关问题