9

如何传递更多的值doInBackground

我的AsyncTask样子是这样的。

private class DownloadFile extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... sUrl) {
        {

        }
}

是否有可能以某种方式在我的身上传递更多的价值protected String DoInBackground

例如:protected String doInBackground(String... sUrl, String... otherUrl, Context context)

以及execute之后如何AsyncTasknew DownloadFile.execute("","",this)或者其他的东西?

4

9 回答 9

11

您可以发送多个参数,因为您可以将它们作为可变参数发送。但是您必须使用相同类型的参数。因此,要执行您正在尝试的操作,您可以遵循以下任何操作

选项1

您可以使用 setter 方法设置类成员的某些值,然后使用 doInBackGround 中的值。例如

private class DownloadFile extends AsyncTask<String, Integer, String> {
        private Context context;
        public void setContext(Context c){
            context = c;
        }
        @Override
        protected String doInBackground(String... sUrl) {
        {
              // use context here
        }
}

选项 2

或者您可以使用构造函数来传递值,例如

private class DownloadFile extends AsyncTask<String, Integer, String> {
        private Context context;
        public DownloadFile (Context c){
            context = c;
        }
        @Override
        protected String doInBackground(String... sUrl) {
        {
              // use context here
        }
}
于 2013-05-28T09:14:05.177 回答
7
String... sUrl

三个连续的点表示不止一个字符串。是可变参数

以及如何传递上下文?

您可以强制它添加一个以 Context 作为参数的构造函数:

private Context mContext;
public void setContext(Context context){
    if (context == null) {
      throw new IllegalArgumentException("Context can't be null");
    }
    mContext = context;
}
于 2013-05-28T09:14:06.860 回答
5

你可以在你的 doInBackground 方法中做这样的事情:

String a = sUrl[0]
String b = sUrl[1]

以这种方式执行 AsyncTask:

new DownloadFile().execute(string1,string2);

第一个值: sUrl[0] 将是从 string1 传递的值,而
surl[1] 将是第二个传递的值,即 string2 !

于 2013-05-28T09:41:44.530 回答
3

您不能,原因如下:

protected String doInBackground(String... sUrl, String... otherUrl, Context context)

不是有效的方法签名。点符号 (Varargs) 只能用作方法的最后一个参数。这个限制是因为否则它会使多态性变得更加复杂。事实上,java 怎么知道你的哪些字符串去sUrl,哪些去otherUrl

此外,doInBackground覆盖来自AsyncTask. 因此,您无法更改方法签名。

但是,您可以做的是使这些值成为您的类的成员,并在您的类的构造函数中传递,DownloadFile或者在调用之前添加 setter 来设置它们execute

于 2013-05-28T09:17:35.293 回答
3

是的,您可以传入更多值,constructor但不能传入doInBackground

试试这个方法

 new DownloadFile(String sUrl,String other Url,Context context).execute();

异步任务

 private class DownloadFile extends AsyncTask<String, Integer, String> {

    public DownloadFile(String url,String url2,Context ctx)
    {

    }
    @Override
    protected String doInBackground(String... sUrl) {
    {

    }

}

于 2013-05-28T09:15:12.597 回答
1
new DownloadFile().execute(Str1,str2,str3,........);

这是传递更多网址的一种方法...如果您想在 doinbackground 方法中发送更多值..

public class DownloadFile extends AsyncTask<DataHolders, Integer, String> {
    public class DataHolders {
        public String url;
        public String myval;
    }
    @Override
    protected String doInBackground(DataHolders... params) {

        return null;
    }
}

你可以用

DataHolders mhold = new DataHolders();
 new DownloadFile().execute(mhold,mhold2,mhold3,........);
于 2013-05-28T09:24:00.970 回答
1

Ypu 可以创建构造函数来传递不同的类型参数和字符串数据,使用 String......str

    private class DownloadTask extends AsyncTask<String, Integer, String> {
        private Context context;
          byte[] byteArray;
        public DownloadTask (Context c,byte[] byteArray){
            context = c;
            byteArray=byteArray;
        }
        @Override
        protected String doInBackground(String... str) {
        {
              // use context here
     System.out.println(param[0]);
          }
  }



new DownloadTask(context,bytearray).excute("xyz");
于 2013-05-28T09:26:21.747 回答
1

你可以使用构造函数

 private class DownloadFile extends AsyncTask<String, Integer, String> {
            private Context context;
            public void DownloadFile(Context c,String one, int two){
                context = c;
            }
            @Override
            protected String doInBackground(String... sUrl) {
            {
                  // use context here
            }
    }
于 2013-05-28T09:15:12.237 回答
1
new DownloadFile().execute("my url","other parameter or url");    
private class DownloadFile extends AsyncTask<String, Integer, String> {
            @Override
            protected String doInBackground(String... sUrl) {
            {
                try {
                    return downloadContent(sUrl[0], sUrl[1]); // call
                } catch (IOException e) {
                    return "Unable to retrieve data. URL may be invalid.";
                }
            }
    }
于 2017-01-19T20:27:31.647 回答