3

我需要将两个参数(lv 和位置)传递给 Asynctask doInBackground 方法,但我不知道该怎么做......

LoadSound.execute(lv,position)
class LoadSound extends AsyncTask<**[ListView,int]**, String, String>

谢谢!

编辑:

我有一个列表视图。如果单击项目播放声音(来自 Internet)。

我想用 Asynctask 显示一个 progressDialog。

在 doInBackground 方法中,我有 itemOnClick:

HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);

出于这个原因,我需要通过 lv 和位置。

4

3 回答 3

22

尝试在您的内部创建一个构造函数,AsyncTask并且每当您创建对象时,您都可以传递参数。像这样的东西:

MyAsyncTask asynctask = new MyAsyncTask(10, true, myObject);
//this is how you create your object

 public class MyAsyncTask extends AsyncTask<Void, Void, Void>{

        int a;
        boolean b;
        Object c;

        public MyAsyncTask(int a, boolean b, Object c){
            this.a = a;
            this.b = b;
            this.c = c;
        }

        @Override
        protected Void doInBackground(Void... params) {
            if(b)
                c = a;
            return null;
        }

    }

然后你可以打电话asynctask.execute();

编辑:阅读您更新的问题后,我同意 Squonk 使用服务例如播放背景声音;你也可以在启动你的 AsynkTask 之前显示一个进度对话框(如果这个是不确定的)并在你的 postexecute 中将其关闭。

于 2012-07-04T21:54:52.277 回答
8

就像在这个答案中所说的那样,您可以使用对象数组作为参数:

private class LoadSound extends AsyncTask<Object, String, String> {
    @Override
    protected void doInBackground(Object... params) {
        ListView lv = (ListView) params[0];
        int position = (Integer) params[1];
    }
    // ...
}

确保将它们转换为正确的对象类型

这就是如何调用AsyncTask

LoadSound loadSound = new LoadSound();
loadSound.execute(lv, position);
于 2013-04-04T09:45:12.603 回答
3

您可以创建一个包含参数的内部类,如下所示:

public static class LoadSoundParam {
    public ListView lv;
    public int position;
}

class LoadSound extends AsyncTask<LoadSoundParam, String, String> {
    ...
}

LoadSoundParam param = new LoadSoundParam();
param.lv = lv;
param.position = position;

loadsound.execute(param);

编辑

正如 Squonk 在他对您的 OP 的评论中提到的那样,将 ListView 传递给 AsyncTask 并不是一个好主意。因此,这段代码展示了如何将多个参数传递给 AsyncTask,但在您的情况下使用它并不是一个好主意。

于 2012-07-04T21:56:55.883 回答