我尝试将电子邮件作为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) {
感谢您的任何建议。
答案 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时在构造函数中传递。