还有一些相关的问题,比如How can I pass in 2 parameters to a AsyncTask class? ,但是我遇到了尝试将多个原语作为参数传递给AsyncTask的困难,所以我想分享我的发现。这种微妙之处没有在现有的问题和答案中捕捉到,所以我想帮助任何遇到和我一样的问题的人,为他们省去痛苦。
问题是:我有多个基元参数(例如两个长参数),我想要传递给一个在后台执行的AsyncTask --怎么做?(可以在下面找到我在awhile...can上遇到这个问题的answer...after。)
发布于 2012-08-22 17:04:09
(严格地说)不可能将多个原语传递给AsyncTask。例如,如果您想执行myTask.execute(long1, long2)
并尝试使用相应的方法设置private class myTask extends AsyncTask<long, Void, Void>
:
@Override
protected LocationItemizedOverlay doInBackground(long... params) {...}
您的IDE可能会抱怨需要重写超类型方法。注意,您对doInBackground
使用了所谓的Varargs方法签名,其中(long... params)
类似于说“我接受一个可变数量的long,存储为一个名为params的数组。我不完全理解是什么导致了编译器/集成开发环境的问题,但我认为这与泛型类Params
的定义有关。
在任何情况下,只要您正确地将原语转换为它们各自的非原语包装器(例如,Integer、Long => long等),就可以毫无问题地实现您想要的结果。实际上,您不需要显式地将基元类型转换为非基元类型。Java似乎可以为您处理这一点。您只需按如下方式设置您的ASyncTask (以long为例):
private class MyTask extends AsyncTask<Long, Void, Void> {
@Override
protected void doInBackground(Long... params) {
// Do stuff with params, for example:
long myFirstParam = params[0]
}
...
}
然后,您可以按照最初的意图使用这个类,例如:
MyTask myTask = new MyTask();
myTask.execute(long1, long2);
或者您想要的任意数量的基元,只要它们是相同类型的。如果您需要传递多个类型的原语,也可以这样做,但您需要修改上面的内容以:
private class MyTask extends AsyncTask<Object, Void, Void> {
@Override
protected void doInBackground(Object... params) {
// Do stuff with params, for example:
long myLongParam = (Long) params[0];
int myIntParam = (Integer) params[1];
}
...
}
这更加灵活,但它需要显式地将参数转换为它们各自的类型。如果不需要这种灵活性(即单一数据类型),我建议坚持使用第一个选项,因为它的可读性稍好一些。
发布于 2012-08-22 17:23:57
只需将原语包装在一个简单的容器中,并将其作为参数传递给AsyncTask
,如下所示:
private static class MyTaskParams {
int foo;
long bar;
double arple;
MyTaskParams(int foo, long bar, double arple) {
this.foo = foo;
this.bar = bar;
this.arple = arple;
}
}
private class MyTask extends AsyncTask<MyTaskParams, Void, Void> {
@Override
protected void doInBackground(MyTaskParams... params) {
int foo = params[0].foo;
long bar = params[0].bar;
double arple = params[0].arple;
...
}
}
这样叫它:
MyTaskParams params = new MyTaskParams(foo, bar, arple);
MyTask myTask = new MyTask();
myTask.execute(params);
发布于 2014-01-15 01:38:35
另一种方法:您只需在MyTask类中添加MyTask构造函数:
private class MyTask extends AsyncTask<String, Void, Void> {
int foo;
long bar;
double arple;
MyTask(int foo, long bar, double arple) {
// list all the parameters like in normal class define
this.foo = foo;
this.bar = bar;
this.arple = arple;
}
...... // Here is doInBackground etc. as you did before
}
然后调用
new MyTask(int foo, long bar, double arple).execute();
另一种方式就像David Wasser的答案。
https://stackoverflow.com/questions/12069669
复制相似问题