1

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非同期タスクが配置されているアクティビティです。

このコードを実行するとloginDatanull. 問題をトレースして、指定された場所にブレークポイント 1 を配置しました。と の両方が空loginpassはないことがわかり、プログラム フローが最後の行return new LoginData(...);. そこから戻ります... a null.

問題をさらに追跡して、ブレークポイント 2 を追加しましたが、コンストラクターLoginData(...)が呼び出されないことがわかりました。

だから私の最初の質問は、ここで本当に明らかな何かが欠けているのでしょうか? そうでない場合は、コンパイルして実行するコードに奇妙な問題があります。

いくつかのコメント:

  • LoginDataプログラムの別の場所で使用され、機能します-ブレークポイント2がキャッチされます。
  • LoginDataどこかにキャッシュされているか、奇妙な名前の衝突がある場合に備えて、別の名前に変更しようとしました。
  • これを Eclipse の Android 2.1 エミュレーターと Galaxy Tab で実行してみました。
  • プロジェクトのクリーニングとビルドを再度試みました。
  • プロジェクトを閉じてもう一度開いてみました。
  • ワークスペースからプロジェクトを削除して、再度インポートしようとしました。

新しい Eclipse ワークスペースを作成する必要は避けたいと思います (これが最後のチャンスです。Java EE を扱う際の同様のケースで役に立ちました)。

何をすべきか?

4

3 に答える 3

2
if (Utils.isEmpty(login) || Utils.isEmpty(pass))

このチェックを次のように置き換えてみてください

if (login==null || pass==null)
于 2012-06-27T20:19:28.583 に答える
0

ここに何かが欠けているかもしれませんが、「LoginData」クラスのコンストラクターが別の名前のクラス (「Login」) 内にあるのはなぜですか?

クラスを 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;
    }

    //Other Methods
}
于 2012-06-27T20:14:12.500 に答える
0

OK、それは私の問題でした。(基本的には条件の否定) の実装が不適切なUtils.isEmpty()別のクラスからインポートされていました。UtilsisEmpty()

ただし、これに時間がかかる原因となった問題は、ブレークポイント 1 に到達した後return null;、フローが に移動するのではなく、 に移動するのが見られなかったことreturn new LoginData(login, pass);です。これは私を誤解させます...

誰か助けてくれてありがとう、結局それ問題でしたisEmpty()

于 2012-06-27T20:32:18.270 に答える