Android:AsyncTask.doInBackground中的可取消Java集合排序
我正在为Android手机编写一个应用程序 我有一个Android:AsyncTask.doInBackground中的可取消Java集合排序,java,android,collections,android-asynctask,Java,Android,Collections,Android Asynctask,我正在为Android手机编写一个应用程序 我有一个java.util.ArrayList,其中包含需要自定义java.util.Comparator才能正确排序的对象 我知道我可以使用java.util.Collections.sort(),但由于数据量太大,我想在android.os.AsyncTask中对ArrayList进行排序 我不想使用多个AsyncTask对象来分别对数据的子集进行排序 任何异步任务都可以取消,因此我希望在排序时定期调用AsyncTask.isCancelled()
java.util.ArrayList
,其中包含需要自定义java.util.Comparator
才能正确排序的对象
我知道我可以使用java.util.Collections.sort()
,但由于数据量太大,我想在android.os.AsyncTask
中对ArrayList
进行排序
我不想使用多个AsyncTask对象来分别对数据的子集进行排序
任何异步任务都可以取消,因此我希望在排序时定期调用AsyncTask.isCancelled()
。如果返回true,我将放弃排序(以及整个数据集)
我在谷歌上搜索了一下,但在定期检查取消情况时,找不到一种方便排序的方法
在我的java.util.Comparator.compare()
实现中,我可能能够调用isCancelled()
,并在返回true时抛出我自己的java.lang.RuntimeException
子类。然后尝试{java.util.Collections.sort(ArrayList,Comparator);}catch(){}
获取该特定异常。我对这种方法感到不太舒服
或者,我可以使用中介java.util.TreeSet
并编写两个循环,每个循环在每次迭代之前检查取消。第一个循环将ArrayList
的所有项添加到TreeSet
(我的Comparator
实现在插入时保持它们的排序)。由于TreeSet
naturaljava.util.Iterator
,第二个循环将以正确的顺序将TreeSet
中的所有对象添加回ArrayList
。这种方法使用了一些额外的内存,但肯定会起作用
我能想到的最后一种方法是实现我在Android中一直在寻找的东西:使用java.util.Comparator
和定期检查取消的Android.os.AsyncTask
进行通用java.util.List
(最好是快速)排序
有人发现了吗?对于这个问题,你还有别的解决办法吗 编辑:
虽然我没有考虑过排序方法签名会是什么样子,但我也非常乐意使用
android.os.CancellationSignal
来决定何时放弃排序。我将尝试在这里描述我的思考过程。如果任何人在任何时候都有更好的报价
让我们再次确认我们在这里努力实现的目标。
我们需要一个具有以下属性的排序算法
采用这种算法,在每次迭代中添加一个检查asyncTask.isCancelled()的方法,您就可以得到一个满足所有要求的解决方案。或者您可以运行一个单独的线程来检查isCancelled(),这样做的目的是,当isCancelled返回true时,只需使您的排序类或方法终止。如果任务被取消,我将投票支持从comparator中抛出RuntimeException。这可能看起来像是一个小技巧,但考虑到这种情况,它比必须滚动您自己的排序代码更优雅。