Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将AsyncTask实例传递给另一个类中的方法以发布进度是否合适?_Android_Android Asynctask - Fatal编程技术网

Android 将AsyncTask实例传递给另一个类中的方法以发布进度是否合适?

Android 将AsyncTask实例传递给另一个类中的方法以发布进度是否合适?,android,android-asynctask,Android,Android Asynctask,我有一个AsyncTask,它调用另一个类(所有计算逻辑所在的类)的方法,该类执行一些后台操作。我想显示操作的状态/进度。我知道我们可以在doInBackground()中调用publishProgress()将进度发布到UI线程。但是由于逻辑驻留在另一个类中,我需要传递AsyncTask的实例,以便从那里调用publishProgress() 这样合适吗?它是否会导致任何运行时问题或内存泄漏 如果有人经历过这一切,请引导我以正确的方式实现这一点 Edit1:在AsyncTask中,我调用的是一

我有一个AsyncTask,它调用另一个类(所有计算逻辑所在的类)的方法,该类执行一些后台操作。我想显示操作的状态/进度。我知道我们可以在
doInBackground()
中调用
publishProgress()
将进度发布到UI线程。但是由于逻辑驻留在另一个类中,我需要传递AsyncTask的实例,以便从那里调用
publishProgress()

这样合适吗?它是否会导致任何运行时问题内存泄漏

如果有人经历过这一切,请引导我以正确的方式实现这一点


Edit1:在AsyncTask中,我调用的是一个SOAPweb服务使用AsyncTask根本不是一个好主意-它已经过时了。改用rxJava库

使用AsyncTask根本不是一个好主意——它已经过时了。改为使用rxJava库

正如我在您的问题中所理解的,您有一个从doInBackground调用的方法,如果该方法没有保存该方法范围之外的任何内容(在成员或静态成员或静态成员的成员中等)因此,可以合理地说,执行本身不会泄漏AsyncTask及其引用的上下文。但还有更多的问题,即使是上述情况,您仍然有很多方法会泄漏此异步任务

正如我在您的问题中所理解的,您有一个从doInBackground调用的方法,如果该方法没有保存该方法范围之外的任何内容(在成员、静态成员或静态成员的成员等中),那么可以合理地说,执行本身不会泄漏AsyncTask和从中引用的上下文。但还有更多的问题,即使是上述情况,您仍然有很多方法会泄漏此异步任务

@PiyushGupta:会不会导致内存泄漏?考虑一个方向改变的场景。@Rithe:我已经在使用它了。这是一个回调方法。但是要触发它,我们需要在
doInBackground()
中调用
publishProgress(someValue)
。也许你应该先告诉我们为什么要在IntentService上使用AsyncTask,然后给我们一些代码,看看是否有内存泄漏候选,因为在一般情况下,我认为在正确使用AsyncTask时,在执行您打算执行的操作时,不泄漏是可能的。答案取决于你是如何做到的…@OfekRon:我正在从服务器下载一个文件。在下载过程中,我不希望用户与UI交互,因此我将显示一个
ProgressDialog
,其中我希望显示操作的进度。我不熟悉IntentService。如果IntentService可以做到这一点,我会试试。@PiyushGupta:它会导致内存泄漏吗?考虑一个方向改变的场景。@Rithe:我已经在使用它了。这是一个回调方法。但是要触发它,我们需要在
doInBackground()
中调用
publishProgress(someValue)
。也许你应该先告诉我们为什么要在IntentService上使用AsyncTask,然后给我们一些代码,看看是否有内存泄漏候选,因为在一般情况下,我认为在正确使用AsyncTask时,在执行您打算执行的操作时,不泄漏是可能的。答案取决于你是如何做到的…@OfekRon:我正在从服务器下载一个文件。在下载过程中,我不希望用户与UI交互,因此我将显示一个
ProgressDialog
,其中我希望显示操作的进度。我不熟悉IntentService。如果IntentService可以实现这一点,我会尝试一下。为什么说它已经过时了?因为它(AsyncTask)只能在后台线程上做一些工作(您还应该提供线程池)并在主线程上处理结果。在rxJava中,您可以在一个线程上创建数据,在另一个线程中处理数据(通常是Schedulers.io()和Schedulers()计算,但您可以从HandlerThread创建自定义调度程序),然后在不同的线程中处理结果。您还可以将几个任务的结果合并在一起,等等。改型2支持rxJava,所以如果您使用REST API,这将非常方便。我同意您的看法。事实上,我在我的项目中使用了Reformation+RxJava,而不是AsyncTask。是的,改型+RxJava是一个更好的解决方案,但这并不是AsyncTask过时的原因。使用这个堆栈(改型+RxJava)会涉及到更多对项目的依赖性,在某些情况下,为了简单起见,使用AsyncTask可能会更好。@bigdestroyer only他(Alex)说AsyncTask已经过时了。。。并非谷歌的RXJava在您的生产中需要200KB,apk现在几乎在所有地方都使用——从改装呼叫适配器到处理ui事件(rxBinding)和传感器读数。它比AsyncTask灵活得多。你为什么说它过时了?因为它(AsyncTask)只能在后台线程上做一些工作(你也应该提供线程池)并在主线程上处理结果。在rxJava中,您可以在一个线程上创建数据,在另一个线程中处理数据(通常是Schedulers.io()和Schedulers()计算,但您可以从HandlerThread创建自定义调度程序),然后在不同的线程中处理结果。您还可以将几个任务的结果合并在一起,等等。改型2支持rxJava,所以如果您使用REST API,这将非常方便。我同意您的看法。事实上,我在我的项目中使用了Reformation+RxJava,而不是AsyncTask。是的,改型+RxJava是一个更好的解决方案,但这并不是AsyncTask过时的原因。使用这个堆栈(改型+RxJava)会涉及到更多对项目的依赖性,在某些情况下,为了简单起见,使用AsyncTask可能会更好。@bigdestroyer only他(Alex)说AsyncTask已经过时了。。。现在,apk几乎在任何地方都被使用——从改装调用适配器到处理ui事件(rxBinding)以及