从onClick(对话框界面对话框)执行AsyncTask



目前我有两个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() {
}

最新更新