【问题标题】:Dialog box error in asynctask异步任务中的对话框错误
【发布时间】:2011-10-18 18:40:30
【问题描述】:

当我尝试显示异步任务的工作对话框时,我收到以下错误: java.lang.reflect.InvocationTargetException java.lang.NullPointerException

activity和asynctask的代码是:

public class MainActivity extends Activity {

    private ControlLogin ctlLogin;
    private ProgressDialog dialog;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        ctlLogin = (ControlLogin)findViewById(R.id.controlLogin);

        ctlLogin.setOnLoginListener(new OnLoginListener()
    {
        @Override
        public void onLogin(String email, String password, Boolean saveAccount){


            ProgressDialog dialog = new ProgressDialog(getApplicationContext());
            dialog.setMessage("Signing...");
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);

            new Login().execute(email, password);
        }
    });



    }

    public class Login extends AsyncTask<String, Float, CloudApp> {

        protected void onPreExecute(){
            dialog.show();
        }
        @Override
        protected CloudApp doInBackground(String... arg0) {
            CloudApp api = new CloudAppImpl(arg0[0], arg0[1]);
            return api;
        }

        protected void onPostExecute(CloudApp api){

            dialog.dismiss();
            try {
                CloudAppAccount acc = api.getAccountDetails();
                Toast toast = Toast.makeText(getBaseContext(), "test: " + acc.getEmail(), Toast.LENGTH_LONG);
                toast.show();
            } catch (CloudAppException e) {
                e.printStackTrace();
            }
        }

    }

}

有什么帮助???谢谢!!

【问题讨论】:

  • 您应该发布 NullPointerException 的堆栈跟踪。
  • 如何获取堆栈跟踪?
  • 从 DDMS 获取错误日志 -> Logcat 窗口
  • Stacktrace 是不必要的,nicholas.hauschild 解决了下面的问题。确保你点击了他的答案旁边的复选标记!

标签: java android progressdialog android-asynctask


【解决方案1】:

通过在 onLogin(...) 方法中定义局部变量 dialog,您将成员 dialog 隐藏在代码中。因此,dialog 永远不会被初始化为任何东西,这就是为什么你会在 Login 类中获得 NPE。

    @Override
    public void onLogin(String email, String password, Boolean saveAccount){

        //remove the leading ProgessDialog here...it is hiding your member 'dialog'
        //dialog = new ProgressDialog(getApplicationContext());
        ProgressDialog dialog = new ProgressDialog(getApplicationContext());
        dialog.setMessage("Signing...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);

        new Login().execute(email, password);
    }

【讨论】:

  • 我删除了这条线,它又失败了
  • 不要删除该行,删除该行的第一个单词...我已经编辑了我的帖子...
  • 好的,现在的错误是:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
  • 嗯,这听起来应该是一个新问题,因为这个问题似乎已经解决了。您自己研究过这个新异常吗?
【解决方案2】:

您确定您的对话框在您关闭时存在吗?我认为在 onLogin 中您重新创建了一个与您的活动字段变量同名的新对话框变量。

protected void onPostExecute(CloudApp api) {

            dialog.dismiss(); // this one is not initialized
            try {
                CloudAppAccount acc = api.getAccountDetails();

你可能会谨慎行事:

 if (dialog != null) dialog.dismiss();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多