谷歌反对android 11中的android asynctask api,并建议使用 java.util.concurrent
相反你可以在这里查看提交
*
* @deprecated Use the standard <code>java.util.concurrent</code> or
* <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
* Kotlin concurrency utilities</a> instead.
*/
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {
如果您在android中使用异步任务维护一个较旧的代码库,那么将来可能需要对其进行更改。我的问题是,应该使用什么来正确替换下面显示的代码段 java.util.concurrent
. 它是活动的静态内部类。我正在寻找一些可以与之合作的东西 minSdkVersion 16
```
private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
private WeakReference activityReference;
LongRunningTask(MyActivity context) {
activityReference = new WeakReference<>(context);
}
@Override
protected MyPojo doInBackground(String... params) {
// Some long running task
}
@Override
protected void onPostExecute(MyPojo data) {
MyActivity activity = activityReference.get();
activity.progressBar.setVisibility(View.GONE);
populateData(activity, data) ;
}
}
16条答案
按热度按时间ulmd4ohb1#
很好,它被弃用了,因为
WeakReference<Context>
这一直是一个黑客,而不是一个合适的解决方案。现在人们将有机会清理他们的代码。
根据这一准则,,
Progress
实际上是不需要的,而且有一个String
输入+MyPojo
输出。这实际上很容易实现,无需使用asynctask。
如何传入字符串?像这样:
和
这个例子使用了一个单线程池,它对DB编写(或序列化的网络请求)很有好处,但是如果你想得到一些DB读取或多个请求,你可以考虑下面的执行器配置:
vwkv1x7d2#
您可以从中直接使用执行器
java.util.concurrent
包裹我也搜索了一下,在这个android异步api中找到了一个解决方案,这是一篇不推荐的文章。
不幸的是,这篇文章使用的是kotlin,但经过一点努力,我已经将其转换为java。这就是解决方案。
很简单吧?如果您在项目中使用java8,则可以将其简化一点。
尽管如此,它无法在代码简洁性方面击败kotlin,但它比以前的java版本要好。
希望这对你有帮助。非常感谢。
inn6fuwd3#
最简单的替代方法之一是使用
Thread
```new Thread(new Runnable() {
@Override
public void run() {
// do your stuff
runOnUiThread(new Runnable() {
public void run() {
// do onPostExecute stuff
}
});
}
}).start();
new Thread(() -> {
// do background stuff here
runOnUiThread(()->{
// OnPostExecute stuff here
});
}).start();
z0qdvdin4#
根据android文档
AsyncTask
api级别30中已弃用,建议改用标准java.util.concurrent或kotlin并发实用程序。使用后者可以非常简单地实现:
在上创建泛型扩展函数
CoroutineScope
:将该函数与任何
CoroutineScope
:在里面
ViewModel
:在里面
Activity
或Fragment
:使用
viewModelScope
或lifecycleScope
将下一行添加到应用程序的build.gradle文件的依赖项:写作时
final LIFECYCLE_VERSION = "2.3.0-alpha05"
更新:此外,我们还可以使用
onProgressUpdate
功能:使用任何
CoroutineScope
(参见上面的实现)我们可以称之为:jrcvhitl5#
使用该类在后台线程中执行后台任务该类适用于所有android api版本,包括android 11,该代码与使用doinbackground和onpostexecute方法的asynctask的工作方式相同
复制上述类后,您可以将其用于:
7gyucuyw6#
在这里,我使用协程为asynctask创建了一个替代方案,该方案可以与asynctask一样使用,而无需更改项目中的许多代码库。
创建一个新的抽象类AsyncTaskCorroutine,它接受输入参数和输出参数数据类型。当然,这些参数是可选的:)
2.“内部活动”现在将其与旧AsycntTask一样使用
如果您需要发送pass参数
jpfvwuh47#
android弃用了android 11中的AsyncTaskAPI,以解决一部分问题。
那么,现在是什么?
线程
执行者
rxjava
可倾听的未来
协同程序🔥
为什么要合作?
协同程序是kotlin异步编程的方式。自kotlin 1.3以及
kotlinx.coroutines
图书馆-结构化并发
非阻塞顺序码
对消传播
自然异常处理
thtygnil8#
谷歌建议使用java的并发框架或kotlin协程。但是rxjava最终拥有了比java并发更大的灵活性和特性,因此获得了相当多的流行。
vlju58qv9#
您可以使用此自定义类作为asynctask<>的替代方案,这与asynctask相同,因此您不需要为相同的任务进行额外的工作。
如何使用它?请按照下面的例子。
用lambda表达式
没有lambda表达式
注意:不要忘记关闭executors服务
ui7jx7zq10#
我的自定义替换:https://github.com/johnydadeveloper/androidasync
它仅在应用程序正在运行时(更具体地说是安排任务的活动)起作用,但它能够在后台任务完成后更新ui
编辑:我的异步任务不再需要活动才能正常工作。
jtoj6r0c11#
您可以根据需要迁移到下一种方法
线程+处理程序
执行人
未来
意向服务
作业调度器
rxjava
协同程序(Kotlin)
[android异步变体]
5jdjgkvh12#
实际上,我写了两个关于它的中间故事:
现在不推荐使用asynctas什么
现在不推荐使用asynctas,第2部分是什么
第一个是java和runnable解决方案,第二个是kotlin和协程解决方案。当然,这两者都有代码示例。
rkue9o1l13#
只需用这个线程替换整个类,并将其放入一个传递变量的方法中
在片段中,将上下文添加到
runOnUiThread()
方法:ktecyv1j14#
handlerthread可以用作asynctask的替代方案。它们是长时间运行的线程。handlerthread的示例如下:
您可以创建两个处理程序对象。其中一个将用于将消息从workerthread发送到ui线程。
另外,请记住handlerthreads在活动的生命周期之外运行,因此需要正确清理它们,否则会出现线程泄漏。您可以在活动的ondestroy()中使用quit()或quitsafety()方法来防止线程泄漏。
5rgfhyps15#
这是我的密码
以及使用示例。扩展
AsyncTaskRunner
类,那就用它吧!