【问题标题】:Dismissing progress Dialog from another thread and class从另一个线程和类中关闭进度对话框
【发布时间】:2014-03-05 12:48:12
【问题描述】:

我有一个单独的 AsyncTask 类,它执行一些耗时的任务。从活动中调用 AsyncTask 时,将启动一个进度对话框。如果用户取消对话框或在执行后台任务时发生错误,则沿线解除。如果后台进程成功,它应该运行verifyingUser 方法,因为它是主Activity。这就是我的问题所在。这是我的代码:

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

 private ProgressDialog mpDialog;
 private CreateAccountTask task; 
 private Context context;
 private Activity activity;
 private CreateAccount createAccount;
 private AsyncTaskListener asyncTaskListener;


 public CreateAccountTask(Activity activity, AsyncTaskListener asyncTaskListener){

this.activity = activity;
this.asyncTaskListener = asyncTaskListener;
}


@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();

    mpDialog = new ProgressDialog(activity);

    //mpDialog.setTitle("Creating Account");
    mpDialog.setMessage("Please wait.");
    mpDialog.setCancelable(false);
    mpDialog.setIndeterminate(false);
    mpDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL", new      DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface arg0, int arg1) {
            // TODO Auto-generated method stub
            //task.cancel(true);
            mpDialog.dismiss();

        }
    });

    mpDialog.show();

}


@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub

String fphoneNo = arg0[1];
String fpassword = arg0[0];

// create instance of the parseUser Class
ParseUser newUser = new ParseUser();
newUser.setUsername(fphoneNo);
newUser.setPassword(fpassword);

// here Check if progress dialog has been cancelled

if (!isCancelled()){

// if dialog has not been cancelled create the new user here
newUser.signUpInBackground(new SignUpCallback() {

    @Override
    public void done(ParseException e) {

              // Something went wrong Sorry!

        if(e != null ){


            if(!isCancelled()){
            mpDialog.dismiss();

            String errorMessage = e.getMessage().toString();

            ErrorHappened(errorMessage);

            }

            else{

                String errorMessage = "Registration Cancelled!";
                ErrorHappened(errorMessage);

            }

        }

        // No Problems 
        else {
            if (!isCancelled()) {

                // Wait for five seconds before starting the activity
                //verifyingUser();

            }
            else {
                String errorMessage = "Registration Cancelled2!";
                ErrorHappened(errorMessage);

                //Delete user in background
                ParseUser currentUser = ParseUser.getCurrentUser();
                if (currentUser != null) {
                    currentUser.deleteInBackground();
                }

            }
        }   

        }

                });

}

return null;
}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
asyncTaskListener.onTaskComplete(result);
}

private void ErrorHappened(String errorMessage) {

Crouton CreateMagic = Crouton.makeText(createAccount, errorMessage, CroutonClass.ALERT);
CreateMagic.setConfiguration(CroutonClass.configure);
CreateMagic.show();


}

}

这是我的主要活动,当调用verifyingUser 方法时,我尝试关闭进度对话框:

 public class CreateAccount extends ActionBarActivity implements AsyncTaskListener {



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_account);


mPassWord = (EditText) findViewById(R.id.password);
mcreateAccount = (Button) findViewById(R.id.createAcct);
mPhoneNumber = (EditText) findViewById(R.id.Phone_Number);



// create account Method
createAccount();    

}//end of on create.


public void createAccount() {

mcreateAccount.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {


            CreateAccountTask newTask = new CreateAccountTask(CreateAccount.this, new    CreateAccount());
            newTask.execute(passwordString, fpartphoneNo);



        });

}

private void verifyingUser() {

ok();


}

protected void ok() {
    // TODO Auto-generated method stub

    CreateAccountTask.mpDialog.dismiss();

    Intent nextPage = new Intent(getBaseContext(), VerifyAccount.class);
    startActivity(nextPage);


}

@Override
public void onBackPressed() {
// TODO Auto-generated method stub

Crouton.cancelAllCroutons();
super.onBackPressed();
}

@Override
public void onTaskComplete(String result) {
// TODO Auto-generated method stub

}

}

当它试图关闭对话框时出现此异常:

 03-05 13:43:32.839: E/AndroidRuntime(21782): FATAL EXCEPTION: main
 03-05 13:43:32.839: E/AndroidRuntime(21782): java.lang.NullPointerException
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.content.ComponentName.<init>  (ComponentName.java:75)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.content.Intent.<init>(Intent.java:3655)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.example.razcat.CreateAccount.ok(CreateAccount.java:527)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.example.razcat.CreateAccount$3.done(CreateAccount.java:480)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.example.razcat.CreateAccount$3.done(CreateAccount.java:1)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.parse.FunctionCallback.internalDone(FunctionCallback.java:44)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.parse.Parse$6$1.run(Parse.java:834)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.os.Handler.handleCallback(Handler.java:615)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.os.Handler.dispatchMessage(Handler.java:92)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.os.Looper.loop(Looper.java:155)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at android.app.ActivityThread.main(ActivityThread.java:5454)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at java.lang.reflect.Method.invokeNative(Native Method)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at java.lang.reflect.Method.invoke(Method.java:511)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
 03-05 13:43:32.839: E/AndroidRuntime(21782):   at dalvik.system.NativeStart.main(Native Method)

如何从verifyingUser 方法中关闭对话框?

【问题讨论】:

  • 第 527 行是什么@CreateAccount?
  • 这是一个方法 ok(),其中包含 CreateAccountTask.mpDialog.dismiss(); 我正在关闭对话框。
  • 您也发布了该代码吗?如果不是,请发布该方法
  • 你有ComponentName 的课吗?如果不是,您确定要初始化要关闭的对话框吗?
  • 不,我没有ComponentName 课程。当我在不同的类中创建对话框时,如何在我的活动中初始化对话框。

标签: java android android-asynctask


【解决方案1】:

您正试图在工作线程中修改 UI 组件。您必须在 onPostExecute 或主线程中执行此操作。您可以做的是取消任务或返回 null 或一些标志值,然后关闭 onPostExecute。

Android - Cancel AsyncTask Forcefully

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多