目前我有两个java类,一个是AsyncTask,另一个是extend DialogFragment。
我想调用ChooseAddContact java类中的CreateGroupTask(AsyncTask)。我已经尝试了几种推荐的方法来执行AsyncTaskjava,但都失败了。对此有什么建议或解决方案吗?
public class ChooseAddContact extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pick_add)
.setItems(R.array.contact_array, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (which == 0){
AddContactDialog dialog2 = new AddContactDialog();
dialog2.show(getFragmentManager(), "AddContactDialog");
} else if (which == 1){
**How should I CALL it here??
//new CreateGroupTask().execute();
//makegroup = new CreateGroupTask();
//makegroup.execute();
}**
}
});
return builder.create(); }
}
和
public class CreateGroupTask extends AsyncTask<Void, Void, String> {
private Context mContext;
private ProgressDialog pd;
public CreateGroupTask() {
}
public CreateGroupTask(Context mContext) {
super();
this.mContext = mContext;
}
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(mContext, null, "Creating group...");
}
@Override
protected String doInBackground(Void... params) {
String chatId = ServerUtilities.create();
if (chatId == null) return null;
try {
...
} catch (SQLException sqle) {}
return chatId;
}
@Override
protected void onCancelled() {
pd.dismiss();
}
@Override
protected void onPostExecute(String result) {
pd.dismiss();
if (result != null) {
Toast.makeText(mContext, "Group created " + result, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(mContext, "Group creation failed. Please retry later.", Toast.LENGTH_LONG).show();
}
}
}
对话片段
要启动异步任务,您需要上下文。在对话框Fragment中,您可以通过调用getActivity()
来获取上下文;或者可以在对话片段的onAttach()
生命周期方法中获得context or activity
引用。已经参数化的构造函数有更好的去除零参数化构造函数。
new CreateGroupTask(getActivity()).execute();
(OR)
private Activity activity;
onAttach(Activity activity){
this.activity=activity;
//store this activity reference
}
//Then Call
new CreateGroupTask(activity).execute();
您可以创建CreateGroupTask类的对象,并在任何需要的地方执行。
CreateGroupTask createGroupTask = new CreateGroupTask();
然后
`if(which==0){AddContactDialog dialog2=新的AddContact Dialog();
dialog2.show(getFragmentManager(), "AddContactDialog");
} else if (which == 1){
createGroupTask.execute();
// Or new CreateGroupTask().execute();
}`
尝试这个并告诉我们是否有任何错误
AsyncTask中缺少的是上下文。您正在以下代码中使用mContext
pd = ProgressDialog.show(mContext, null, "Creating group...");
但您没有在默认构造函数中初始化该对象。
调用任务时使用getActivity
new CreateGroupTask(getActivity()).execute();
还从您的代码中删除以下构造函数
public CreateGroupTask() {
}