在我目前正在进行的项目中,有大量的缓存在主线程上完成,这使得应用程序滞后。我的计划是制作这些的异步变体,但仍然保持同步调用,以便在asyncTasks中组合时更容易链接。我有这个问题,我希望以某种直观的方式阻止在GUI线程中使用缓存功能。有任何想法吗?可能吗?是否可以使用注释标记一个方法,以防止在GUI线程上调用它?
答案 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文档),假设同步代码使用缓慢的阻塞方法foo
,bar
和baz
:
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语法。)
方法foo
,bar
和baz
的实现将返回Promise
并在工作线程上执行实际工作。您可以自己做好准备,或使用JQ
提供的工具轻松创建承诺,并将相关的工作卸载到工作线程:
private Promise<Integer> foo() {
return JQ.defer(() -> {
int result = 42;
// do some heavy processing...
return result;
});
}
请注意,JQ
还为多个并行操作的同步提供了有用的utilities,为长时间运行的操作添加了超时等等。
免责声明:因为我是JQ的作者,所以有些无耻的推广。 ;)