自动登录始终返回Null

时间:2015-04-15 01:19:17

标签: android service nullpointerexception sharedpreferences

目前,我的应用程序登录会提示用户输入用户名和密码,然后提交按钮将信息发送到服务和我的服务器:

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {

            imService = ((MessagingService.IMBinder) service).getService();

            if (imService.isUserAuthenticated() == true) {

                Intent i = new Intent(LoggingIn.this, MainActivity.class);
                startActivity(i);
                LoggingIn.this.finish();
            }
        }

        public void onServiceDisconnected(ComponentName className) {

            imService = null;
            Toast.makeText(LoggingIn.this, R.string.local_service_stopped,
                    Toast.LENGTH_SHORT).show();
        }
    };

        /*
         * Start and bind the imService
         */
        startService(new Intent(LoggingIn.this, MessagingService.class)); 

        usernameText = (EditText) findViewById(R.id.username);
        passwordText = (EditText) findViewById(R.id.password);

        loginButton.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if (imService == null) {
                    Toast.makeText(getApplicationContext(),
                            R.string.not_connected_to_service,
                            Toast.LENGTH_LONG).show();
                    // showDialog(NOT_CONNECTED_TO_SERVICE);
                    return;
                } else if (imService.isNetworkConnected() == false) {
                    Toast.makeText(getApplicationContext(),
                            R.string.not_connected_to_network,
                            Toast.LENGTH_LONG).show();
                    // showDialog(NOT_CONNECTED_TO_NETWORK);

                } else if (usernameText.length() > 0
                        && passwordText.length() > 0) {

                    Thread loginThread = new Thread() {
                        private Handler handler = new Handler();

                        @Override
                        public void run() {
                            String result = null;

                            try {
                                result = imService.authenticateUser(
                                        usernameText.getText().toString().trim(),
                                        passwordText.getText().toString().trim());
                            } catch (UnsupportedEncodingException e) {

                                e.printStackTrace();
                            }
                            if (result == null
                                    || result.equals(AUTHENTICATION_FAILED)) {
                                /*
                                 * Authenticatin failed, inform the user
                                 */
                                handler.post(new Runnable() {
                                    public void run() {
                                        Toast.makeText(
                                                getApplicationContext(),
                                                R.string.make_sure_username_and_password_correct,
                                                Toast.LENGTH_LONG).show();

                                        // showDialog(MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT);
                                    }
                                });

                            } else {

                                /*
                                 * if result not equal to authentication failed,
                                 * result is equal to friend and group list of
                                 * the user 0: is for friends, 1: is for groups
                                 */
                                handler.post(new Runnable() {
                                    public void run() {

                                        // If log in successful, then save
                                        // username and password to shared
                                        // preferences:

                                        SaveSharedPreference.setUserName(
                                                getApplicationContext(),
                                                usernameText.getText()
                                                        .toString());

                                        SaveSharedPreference.setPassword(
                                                getApplicationContext(),
                                                passwordText.getText()
                                                        .toString());

                                        Intent i = new Intent(LoggingIn.this,
                                                MainActivity.class);
                                        startActivity(i);
                                        LoggingIn.this.finish();

                                    }
                                });

                            }

                        }
                    };
                    loginThread.start();

                } else {
                    /*
                     * Username or Password is not filled, alert the user
                     */
                    Toast.makeText(getApplicationContext(),
                            R.string.fill_both_username_and_password,
                            Toast.LENGTH_LONG).show();
                    // showDialog(FILL_BOTH_USERNAME_AND_PASSWORD);
                }   
            }
        });

哪种方法效果很好。我希望实现的是用户自动登录,因为他们已经登录,因此用户名和密码存储在共享首选项中。

因此,当他们再次访问该应用时,应该自动将其登录为:

  private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
        imService = ((MessagingService.IMBinder) service).getService();

        if (imService.isUserAuthenticated() == true) {

            Intent i = new Intent(LoggingIn.this, MainActivity.class);
            startActivity(i);
            LoggingIn.this.finish();
        }
    }

    public void onServiceDisconnected(ComponentName className) {

        imService = null;
        Toast.makeText(LoggingIn.this, R.string.local_service_stopped,
                Toast.LENGTH_SHORT).show();
    }
};

        startService(new Intent(LoggingIn.this, MessagingService.class));

        final String userName = SaveSharedPreference.getUserName(getApplicationContext());

        final String password = SaveSharedPreference.getPassword(getApplicationContext());

        Thread loginThread = new Thread() {
            private Handler handler = new Handler();

            @Override
            public void run() {
                String result = null;

                try {
                    result = imService.authenticateUser(
                            userName.trim(),
                            password.trim());
                } catch (UnsupportedEncodingException e) {

                    e.printStackTrace();
                }
                if (result == null
                        || result.equals(AUTHENTICATION_FAILED)) {
                            /*
                             * Authenticatin failed, inform the user
                             */
                    handler.post(new Runnable() {
                        public void run() {
                            Toast.makeText(
                                    getApplicationContext(),
                                    R.string.make_sure_username_and_password_correct,
                                    Toast.LENGTH_LONG).show();

                            // showDialog(MAKE_SURE_USERNAME_AND_PASSWORD_CORRECT);
                        }
                    });

                } else {

                    handler.post(new Runnable() {
                        public void run() {
                            Intent i = new Intent(LoggingIn.this,
                                    MainActivity.class);
                            startActivity(i);
                            LoggingIn.this.finish();

                        }
                    });

                }

            }
        };
        loginThread.start();

用户信息已成功存储在共享首选项中,但在执行此代码块时,它始终在线返回NullPointerException

                    result = imService.authenticateUser(
                            userName.trim(),
                            password.trim());

在try {} catch块中。

我试图在应用程序中放置一个计时器,也许该服务没有时间启动,但即使在20秒以上仍然无效。

如何获得自动登录功能而不返回?

更新注意: private Manager imService;是一个接口:

public interface Manager {

    public boolean isNetworkConnected();

    public boolean isUserAuthenticated();

}

0 个答案:

没有答案