首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将多个原始参数传递给AsyncTask?

如何将多个原始参数传递给AsyncTask?
EN

Stack Overflow用户
提问于 2012-08-22 17:04:09
回答 4查看 98.3K关注 0票数 84

还有一些相关的问题,比如How can I pass in 2 parameters to a AsyncTask class? ,但是我遇到了尝试将多个原语作为参数传递给AsyncTask的困难,所以我想分享我的发现。这种微妙之处没有在现有的问题和答案中捕捉到,所以我想帮助任何遇到和我一样的问题的人,为他们省去痛苦。

问题是:我有多个基元参数(例如两个长参数),我想要传递给一个在后台执行的AsyncTask --怎么做?(可以在下面找到我在awhile...can上遇到这个问题的answer...after。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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];

    }
    ...
}

这更加灵活,但它需要显式地将参数转换为它们各自的类型。如果不需要这种灵活性(即单一数据类型),我建议坚持使用第一个选项,因为它的可读性稍好一些。

票数 83
EN

Stack Overflow用户

发布于 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);
票数 157
EN

Stack Overflow用户

发布于 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的答案。

票数 95
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12069669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档