Android AsyncTask使用不同的参数

Android AsyncTask使用不同的参数,android,user-interface,android-asynctask,Android,User Interface,Android Asynctask,我正在尝试使用AsyncTask在android上下载一个文件。因为我想下载很多文件,所以我想通过参数传递文件的url。我还想在用户单击触发异步任务的按钮时更改UI。我发现,除了我需要传递的URL和活动本身之外,我还可以访问它的视图,以便更改它们。我的问题是如何让AsyncTask接受多个不同的参数 问题: 1。我认为唯一的方法是将第一个参数作为Object传递,这样任何东西都可以传递,对吗 public final Example extends AsyncTask<Objects, S

我正在尝试使用AsyncTask在android上下载一个文件。因为我想下载很多文件,所以我想通过参数传递文件的url。我还想在用户单击触发异步任务的按钮时更改UI。我发现,除了我需要传递的URL和活动本身之外,我还可以访问它的视图,以便更改它们。我的问题是如何让AsyncTask接受多个不同的参数

问题:

1。我认为唯一的方法是将第一个参数作为Object传递,这样任何东西都可以传递,对吗

public final Example extends AsyncTask<Objects, String, String>
3。如何使用上述参数“something”来更改可见性(例如在视图中)

提前谢谢您的时间

试试这个

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     new Example("URL","something").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});
else
     new Example("URL","something").execute(new String[]{null});
示例异步任务类

public class Example extends AsyncTask<String, Void, JSONObject> {

            // variables passed in:
            String url;
            String something;
            //  constructor
            public Example(String url, String something) {
                this.url = url;
                this.something = something;
            }

            @Override
            protected void onPreExecute() {

            }


            @Override
            protected JSONObject doInBackground(String... args) {

            }


            @Override
            protected void onPostExecute(JSONObject jObjOut) {

            }

        }
公共类示例扩展了异步任务{
//传入的变量:
字符串url;
串东西;
//建造师
公共示例(字符串url、字符串某物){
this.url=url;
这个,某物,某物;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的JSONObject doInBackground(字符串…args){
}
@凌驾
受保护的void onPostExecute(JSONObject jObjOut){
}
}

使用
AsyncTask
的想法是避免在执行阻止操作(如场景的文件下载)时影响UI的响应。当您使用AsyncTask时,
doInBackground
方法在UI之外的另一个线程中执行,并且不能从中修改UI,因此没有必要向其传递任何与UI相关的数据

为了在后台工作完成后修改UI,可以使用
onPostExecute
方法。正如@Tamilan所建议的,如果您想在那里使用
Activity
对象,可以将它传递给
AsyncTask
的构造函数

下面是一个示例任务。请注意,如果仍要将不同的对象类型传递给
doInBackground
方法,则可以将
String
替换为
URL
,甚至可以将
Object
替换为
。此外,本示例不包括返回简单布尔值以外的错误处理

private class ExampleTask extends AsyncTask<String, Integer, Boolean>
{
    private Activity mActivity;

    public ExampleTask(Activity activity)
    {
        mActivity = activity;
    }

    @Override
    protected Boolean doInBackground(String... params) {
        // this is executed in a background thread

        boolean success = true;

        // do your background operations
                    publishProgress(50);
                    // more operations

        return Boolean.valueOf(success);
    }


    @Override
    protected void onProgressUpdate(Integer... progress) {
           updateProgressbar(progress[0]); // update UI
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // this is executed on your UI thread

        if (!result)
            // show error
        else
            // modify your UI
    }
}

AsyncTask有3种通用类型: 1是您发送给执行的参数; 第二个用于在UI上发布更新 第三个是返回结果 如果要跳过其中一个或全部,请使用Void类: 示例:新建AsyncTask()

如果您想在AsyncTask中使用自己的构造函数,您应该在扩展AsyncTask的类中定义它,如下所示:

导入android.app.Activity; 导入android.os.AsyncTask

public class Example extends AsyncTask<Object, String, String>{

private Object data;
private String data1;
private String data2;
private Activity activity;

public Example(Object data, String data1, String data2, Activity activity){
    this.data = data;
    this.data1 = data1;
    this.data2 = data2;
    this.activity = activity;
}

@Override
protected String doInBackground(Object... arg0) {

    //Do here all your needs except UI updating
    //transfer data you need for UI updating like this:
    publishProgress("UI update data argument");

    return null;
}


@Override
protected void onProgressUpdate(String... arg){
    super.onProgressUpdate(arg);

    //Update your UI using activity 
}

您可以使用参数化构造函数来实现相同的功能。但是请注意,如果您有多个参数,那么最终将创建多个构造函数。由于您需要修改多个活动作为响应,因此还需要传递一个上下文

query = UtilityClass.getQueries(UtilityClass.CHECKRIDE, paramsList);
new Example(HomeActivity.this, UtilityClass.CHECKRIDE).execute(query);
这就是创建查询/url并将其传递给AsyncTask的方法

示例异步任务:

public class Example extends AsyncTask<String , Void, String> {

    public Example(Context contextVar, int calloutTypeVar){
    context = contextVar;
    CALLOUTTYPE = calloutTypeVar;
}

@Override
protected void onPreExecute() {
    progressDialog = ProgressDialog.show(context, "Please wait", "Loading...");
}

@Override
   protected String doInBackground(String...sqlQueryList) {
    String result = "";
    String sqlQuery = sqlQueryList[0];
    result = UtilityClass.doHttpCallout(sqlQuery);

   return result;
}

// Handle the response from the callout
@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    progressDialog.dismiss();
    switch (CALLOUTTYPE) {
        case UtilityClass.SCHEDULERIDE:

                ResponseHandlerClass.scheduleRide(result, context);
                break;
    }
}
公共类示例扩展了异步任务{
公共示例(上下文contextVar、int calloutTypeVar){
context=contextVar;
callout类型=callout类型变量;
}
@凌驾
受保护的void onPreExecute(){
progressDialog=progressDialog.show(上下文“请稍候”、“加载…”);
}
@凌驾
受保护的字符串doInBackground(字符串…sqlQueryList){
字符串结果=”;
字符串sqlQuery=sqlQueryList[0];
结果=UtilityClass.doHttpCallout(sqlQuery);
返回结果;
}
//处理来自调用的响应
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
progressDialog.disclose();
开关(类型){
案例效用类.SCHEDULERIDE:
scheduleRide(结果、上下文);
打破
}
}
我已经实现了一个响应处理程序来处理来自各种调用结果的响应


希望这有助于处理来自不同URL的响应。

使用异步地址的构造函数,然后就可以全部通过。@Tamilan您能给我提供一个示例或参考吗?请更新构造函数(或类名)为了匹配或不编译。@Mario我发布了
示例异步任务
类并检查它。@Tamilan;-)如果Mario只需要传递URL,他可以使用AsyncTask的第一个参数,而不是使用构造函数,然后传递新字符串[]{null}在执行中。@Tanilan thx现在又清楚多了!我明白了它是怎么做到的works@fasteque是的,但给出一个更广泛的示例更好。现在,程序员需要根据自己的代码调整这个示例!在哪里执行onProgressUpdate()方法(新线程或主线程)?我想在那里更新进度条,但它崩溃了,所以我需要将其作为参数传递?对吗?
onProgressUpdate
在UI线程中像
onPostExecute
一样执行,因此您可以安全地在那里修改进度条(可以通过构造函数或setter传递).
doInBackground
是在后台线程中执行的唯一方法。有关详细信息,请检查。@Mario I使用
onProgressUpdate
new Example(data, data1, data2, activity).execute(object);
query = UtilityClass.getQueries(UtilityClass.CHECKRIDE, paramsList);
new Example(HomeActivity.this, UtilityClass.CHECKRIDE).execute(query);
public class Example extends AsyncTask<String , Void, String> {

    public Example(Context contextVar, int calloutTypeVar){
    context = contextVar;
    CALLOUTTYPE = calloutTypeVar;
}

@Override
protected void onPreExecute() {
    progressDialog = ProgressDialog.show(context, "Please wait", "Loading...");
}

@Override
   protected String doInBackground(String...sqlQueryList) {
    String result = "";
    String sqlQuery = sqlQueryList[0];
    result = UtilityClass.doHttpCallout(sqlQuery);

   return result;
}

// Handle the response from the callout
@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    progressDialog.dismiss();
    switch (CALLOUTTYPE) {
        case UtilityClass.SCHEDULERIDE:

                ResponseHandlerClass.scheduleRide(result, context);
                break;
    }
}