Eclipse 3.7.2 で Android (API レベル 7) アプリを開発しています。私は最も興味深い問題を抱えています:
LoginData
ログイン情報を保持するために呼び出されるクラスがあります。
public class LoginData {
private final String login;
private final String password;
public LoginData(final String login, final String password) {
this.login = login; // breakpoint 2 here
this.password = password;
}
public String getLogin() {
return login;
}
public String getPassword() {
return password;
}
}
次に、それを取得するメソッドがあります(別のクラスで):
public static LoginData getLoginData(final Context context) {
final SharedPreferences prefs = getPrefs(context);
final String login = prefs.getString(LOGIN, null);
final String pass = prefs.getString(PASS, null);
if (Utils.isEmpty(login) || Utils.isEmpty(pass)) { // breakpoint 1 here
return null;
}
return new LoginData(login, pass);
}
メソッド isEmpty() は次のようになります。
public static boolean isEmpty(final String s) {
return s == null || "".equals(s);
}
getLoginData()
そして、内部で呼び出すメソッドAsyncTask
:
@Override
protected WSResult doInBackground(final Params... params) {
final LoginData loginData = Prefs.getLoginData(context);
...
context
非同期タスクが配置されているアクティビティです。
このコードを実行するとloginData
、null
. 問題をトレースして、指定された場所にブレークポイント 1 を配置しました。と の両方が空login
でpass
はないことがわかり、プログラム フローが最後の行return new LoginData(...);
. そこから戻ります... a null
.
問題をさらに追跡して、ブレークポイント 2 を追加しましたが、コンストラクターLoginData(...)
が呼び出されないことがわかりました。
だから私の最初の質問は、ここで本当に明らかな何かが欠けているのでしょうか? そうでない場合は、コンパイルして実行するコードに奇妙な問題があります。
いくつかのコメント:
LoginData
プログラムの別の場所で使用され、機能します-ブレークポイント2がキャッチされます。LoginData
どこかにキャッシュされているか、奇妙な名前の衝突がある場合に備えて、別の名前に変更しようとしました。- これを Eclipse の Android 2.1 エミュレーターと Galaxy Tab で実行してみました。
- プロジェクトのクリーニングとビルドを再度試みました。
- プロジェクトを閉じてもう一度開いてみました。
- ワークスペースからプロジェクトを削除して、再度インポートしようとしました。
新しい Eclipse ワークスペースを作成する必要は避けたいと思います (これが最後のチャンスです。Java EE を扱う際の同様のケースで役に立ちました)。
何をすべきか?