谷歌不赞成android11中的androidasynctaskapi,并建议使用 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) ;
}
}
14条答案
按热度按时间mzaanser1#
android弃用了android11中的asynctask api来解决一部分问题。
那么,现在怎么办?
线程
执行者
rxjava公司
可上市期货
合作?
为什么要合作?
协同程序是kotlin进行异步编程的方式。自从kotlin1.3和
kotlinx.coroutines
图书馆-结构化并发
非阻塞顺序码
对消传播
自然异常处理
juud5qan2#
google建议使用java的并发框架或kotlin协程。但是rxjava最终拥有了比java并发更大的灵活性和特性,因此获得了相当多的流行。
tyky79it3#
在这里,我为asynctask创建了一个替代方案,它使用协同程序,可以与asynctask一样使用,而无需更改项目中的大量代码库。
创建一个新的抽象类AsyncTaskCorroutine,它接受输入参数和输出参数数据类型当然这些参数是可选的:)
2 . 内部活动使用这个和你以前的asycontask一样
如果您需要发送pass参数
pprl5pva4#
您可以使用此自定义类作为asynctask的替代方法,这与asynctask相同,因此您不需要为相同的任务付出额外的努力。
如何使用?请按照下面的例子。
使用lambda表达式
没有lambda表达式
注意:不要忘记关闭executors服务
jutyujz05#
使用这个类在后台线程中执行后台任务这个类适用于所有的android api版本包括android 11,这个代码与使用doinbackground和onpostexecute方法的asynctask一样工作
复制完这个类之后就这样简单的使用
hs1ihplo6#
您可以根据需要迁移到下一种方法
线程+处理程序
遗嘱执行人
未来
异步任务
内部服务
作业调度器
rxjava公司
协同程序(kotlin)
[android异步变体]
3pvhb19x7#
我的自定义替换:https://github.com/johnydadeveloper/androidasync
它只在应用程序运行时起作用(更具体地说是安排任务的活动),但它能够在后台任务完成后更新ui
编辑:我的asynctask不再需要活动才能运行。
ncgqoxb08#
只需用这个线程替换整个类,并将其放入一个传递变量的方法中
在片段中,将上下文添加到
runOnUiThread()
方法:7tofc5zh9#
handlerthread可以用作asynctask的替代方法。它们是长时间运行的线程。handlerthread的示例如下:
可以创建两个处理程序对象。其中一个将用于将消息从workerthread发送到ui线程。
另外,请记住handlerthreads在活动的生命周期之外运行,因此需要正确清理它们,否则会出现线程泄漏。可以在activity的ondestroy()中使用quit()或quitsaffely()方法来防止线程泄漏。
e5nqia2710#
这是android.os.asynctask类的替代方法:
rryofs0p11#
很好的摆脱了它的不赞成,因为
WeakReference<Context>
总是一个黑客,而不是一个适当的解决方案。现在人们将有机会清理他们的代码。
根据这一准则,
Progress
实际上是不需要的,而且String
输入+MyPojo
输出。这实际上很容易实现,不需要使用任何asynctask。
如何传弦?像这样:
和
此示例使用了一个单线程池,该池适用于db写入(或序列化的网络请求),但如果您需要db读取或多个请求,则可以考虑以下执行器配置:
bkhjykvo12#
最简单的替代方法之一是使用
Thread
```new Thread(new Runnable({
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();
5cg8jx4n13#
根据android文档
AsyncTask
在api级别30中已弃用,建议改用标准java.util.concurrent或kotlin concurrency实用程序。使用后者可以很简单地实现:
在上创建泛型扩展函数
CoroutineScope
:将函数与任何
CoroutineScope
:在
ViewModel
:在
Activity
或者Fragment
:使用
viewModelScope
或者lifecycleScope
向应用程序的build.gradle文件的依赖项添加下一行:在写作时
final LIFECYCLE_VERSION = "2.3.0-alpha05"
更新:我们还可以使用
onProgressUpdate
功能:使用任何
CoroutineScope
(参见上面的实现)我们可以称之为:wd2eg0qa14#
您可以直接使用
java.util.concurrent
包裹。我也搜索了一下,在这个android异步api中找到了一个解决方案。
不幸的是,这篇文章使用的是kotlin,但经过一点努力,我已经将其转换为java。这就是解决办法。
很简单吧?如果您在项目中使用java8,那么您可以简化它。
尽管如此,在代码简洁性方面,它仍然无法击败kotlin,但它比以前的java版本要好。
希望这对你有帮助。谢谢您