2

フィルタ検索バーのonDestroyメソッドを作成しましたが、小さな問題に遭遇しました。

これが私のlogcatです:

09-01 01:55:40.147: E/AndroidRuntime(1014): FATAL EXCEPTION: main
09-01 01:55:40.147: E/AndroidRuntime(1014): java.lang.RuntimeException: Unable to destroy activity {com.stts.sparetimetradingsystem/com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity}: java.lang.NullPointerException
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.access$2900(ActivityThread.java:125)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.os.Looper.loop(Looper.java:123)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at java.lang.reflect.Method.invokeNative(Native Method)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at java.lang.reflect.Method.invoke(Method.java:521)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at dalvik.system.NativeStart.main(Native Method)
09-01 01:55:40.147: E/AndroidRuntime(1014): Caused by: java.lang.NullPointerException
09-01 01:55:40.147: E/AndroidRuntime(1014):     at com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity.onDestroy(HomepageEmployerActivity.java:340)
09-01 01:55:40.147: E/AndroidRuntime(1014):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)
09-01 01:55:40.147: E/AndroidRuntime(1014):     ... 11 more

これは私のコードです:

@Override
protected void onDestroy() {
    super.onDestroy();
    searchBarEmployer.removeTextChangedListener(filterTextWatcher); <--- LINE 340
}

**これは私のログインコードですユーザーが正しい資格情報を入力するとホームページに切り替わります。

public class LoginEmployerActivity extends Activity {
Button btnLoginEmployer;
Button btnLinkToEmployerRegisterScreen;
EditText inputEmail;
EditText inputPassword;
TextView loginErrorMsg;
TextView forgotPassword;

// JSON Response node names
private static String KEY_SUCCESS = "success";
private static String KEY_ERROR = "error";
private static String KEY_ERROR_MSG = "error_msg";
private static String KEY_UID = "uid";
private static String KEY_NAME = "name";
private static String KEY_CNAME = "cname";
private static String KEY_EMAIL = "email";
private static String KEY_CREATED_AT = "created_at";
private ProgressDialog pDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login_employer);

    // Importing all assets like buttons, text fields
    inputEmail = (EditText) findViewById(R.id.loginEmployerEmail);
    inputPassword = (EditText) findViewById(R.id.loginEmployerPassword);
    btnLoginEmployer = (Button) findViewById(R.id.btnLoginEmployer);
    btnLinkToEmployerRegisterScreen = (Button) findViewById(R.id.btnLinkToEmployerRegisterScreen);
    loginErrorMsg = (TextView) findViewById(R.id.login_error);
    forgotPassword = (TextView) findViewById(R.id.link_to_forgetPassword);

    // Login button Click Event
    btnLoginEmployer.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            // Checking for server respond
                new LoginEmployer().execute();
            }
        }
    });

    // Link to Register Screen
    btnLinkToEmployerRegisterScreen
            .setOnClickListener(new View.OnClickListener() {

                public void onClick(View view) {
                    Intent i = new Intent(getApplicationContext(),
                            RegisterEmployerActivity.class);
                    startActivity(i);
                    finish();
                }
            });

    // Link to forgot password link
    forgotPassword.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            // Switching to forgot password screen
            Intent i = new Intent(getApplicationContext(),
                    ForgotPasswordEmployerActivity.class);
            startActivity(i);
        }
    });
}

// Background ASYNC Task to login by making HTTP Request
class LoginEmployer extends AsyncTask<String, String, String> {

    // Before starting background thread Show Progress Dialog
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(LoginEmployerActivity.this);
        pDialog.setMessage("Authenticating...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    // Checking login in background
    protected String doInBackground(String... params) {
        runOnUiThread(new Runnable() {
            public void run() {

                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                EmployerFunctions employerFunctions = new EmployerFunctions();
                JSONObject json = employerFunctions.loginUser(email,
                        password);

                // check for login response
                try {
                    if (json.getString(KEY_SUCCESS) != null) {
                        loginErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);
                        if (Integer.parseInt(res) == 1) {
                            // user successfully logged in
                            // Store user details in SQLite Database
                            DatabaseHandlerEmployer dbe = new DatabaseHandlerEmployer(
                                    getApplicationContext());
                            JSONObject json_user = json
                                    .getJSONObject("user");

                            // Clear all previous data in database
                            employerFunctions
                                    .logoutUser(getApplicationContext());
                            dbe.addUser(
                                    json_user.getString(KEY_NAME),
                                    //json_user.getString(KEY_CNAME),
                                    json_user.getString(KEY_EMAIL),
                                    json.getString(KEY_UID),
                                    json_user.getString(KEY_CREATED_AT));
                            // Launch Employer homePage Screen
                            Intent homepage = new Intent(
                                    getApplicationContext(),
                                    HomepageEmployerActivity.class);

                            // Close all views before launching Employer
                            // homePage
                            homepage.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(homepage);

                            // Close Login Screen
                            finish();
                        } else {
                            // Error in login
                            loginErrorMsg
                                    .setText("Invalid username/password");
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        return null;
    }

    // After completing background task Dismiss the progress dialog
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once done
        pDialog.dismiss();
    }
}

}

4

4 に答える 4

2

searchBarEmployerが初期化され、正しく参照されていることを確認してください。

EditText searchBarEmployer ; // outside onCreate, global to class

onCreate()内で、

searchBarEmployer = (EditText)findViewById(R.id.editTextIdInXML);

また、

@Override
protected void onDestroy() {
    searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    super.onDestroy();

}
于 2012-08-31T18:05:19.340 に答える
1

あなたはそれを間違えました。オーバーライドする場合onCreate()(または一般的にコンストラクターと同様のメソッド)、経験則では、super.onCreate() FIRSTを呼び出し(すべてのstullスーパークラスが必要とする可能性があるなど)、それから作業を行います。ただし、オーバーライドする場合onDestroy()(または一般的にデストラクタと同様の方法)、経験則では、で行ったのとは逆の順序ですべてのクリーンアップを行いますonCreate()。最初に自分のものをクリアし、最後super.onDestroy()のものの1つとして呼び出します。それ以外の方法で(あなたがしたように)それを行うと、スーパークラスがすでに多くのもの(内部変数、参照など)を単純にクリーンアップでき、コードが単にクラッシュするため、多くの問題が発生する可能性があります。このように再配置します:onDestroy()

@Override
protected void onDestroy() {
    searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    super.onDestroy();
}

'あなたが単にnullであるというオプションもあるsearchBarEmployerので、これはおそらくより安全かもしれません:

@Override
protected void onDestroy() {
    if( searchBarEmployer != null ) {
      searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    }
    super.onDestroy();
}
于 2012-08-31T18:02:34.627 に答える
0

必要に応じてsearchBarEmployerを初期化してください。たとえば、searchBarEmployerがテキストビューである場合は、topを宣言し、searchBarEmployer =(TextView)findViewById(R.id ....);を実行します。などなど、それを使用します。

TextView searchBarEmployer=nullの使用は避けてください。一種のアプローチ。

于 2012-08-31T18:08:54.100 に答える
0

デバッグポイントを配置し、それsearchBarEmployerがnullでないことを確認してください。

以前に実行されたいくつかの手順が原因である場合はnull、このステートメントの前にnullチェックを配置してください。

if( searchBarEmployer != null ) {
// Place operation here...
}

また、あなたは移動する必要があります

super.onDestroy();

メソッドの最後のステートメントとして。

編集 私が意味した...

@Override
protected void onDestroy() {
    if( searchBarEmployer != null ) {    // <---- PLACE NULL CHECK
      searchBarEmployer.removeTextChangedListener(filterTextWatcher);
    }
    super.onDestroy();  // <--- LAST STATEMENT
}
于 2012-08-31T18:04:38.073 に答える