Android asynctask,如何通过几个不同的params来执行方法?

时间:2014-01-26 10:10:59

标签: android android-asynctask

我尝试将电子邮件作为assync任务发送。但我不知道如何将不同的参数传递给doInBackground?

我想传递这样的数据:

Context ctx,String typeOfEmail,Map data

如何将其传递给AsyncTask类?

private class LongOperation extends AsyncTask<String, Void, String> {
 @Override
        protected String doInBackground(String... params) {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return "Executed";
        }

public boolean sendLogsByEmail(Context ctx, String typeOfEmail , Map<String, String> data) {

感谢您的任何建议。

4 个答案:

答案 0 :(得分:2)

对于更复杂的参数,您可以添加构造函数:

public LongOperation (Context ctx, String typeOfEmail, Map data) {
  /// here initialize LongOperation class instance fields
}

另外,在AsyncTask中将Context放入WeakReference的安全性,所以它看起来像:

WeakReference<Context> ctx;

然后使用:

Context ctxe = ctx.get();
if ( ctxe != null ) {
   // do something with Context
}

这样您就不会引入在配置更改/或正常活动生命周期中可能发生的引用泄漏。但是因为你的AsyncTask是活动类的内部(我想你的代码),所以它已经隐含了对封闭类的引用 - 这可能是Activity。

答案 1 :(得分:0)

只需将参数声明为要传递的对象的常用超类型,即Object。:

private class LongOperation extends AsyncTask<Object, Void, String> {
    @Override
    protected String doInBackground(Object... params) {
        Context c = (Context) params[0];
        String typeOfEmail = (String) params[1];
        Map data = (Map) params[2];

        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "Executed";
    }

现在像这样调用execute:

myLongOperation.execute(context, emailType, data);

答案 2 :(得分:0)

当您定义AsyncTask时,您正在扩展其类。所以没有什么能阻止你实现自己的方法,你可以简单地定义:

public void my_vars(Context context, String str, Map map) { mycontext = context; mystr = str, mymap = map; }

并在调用execute()方法之前调用它。

答案 3 :(得分:0)

你可以这样做

 new LongOperation().execute(new String[5]/* or add many parameter of string type*/); 

您还可以在类LongOperation中创建一个arg构造函数,然后在创建obj时在构造函数中传递。