2

クラスには、thieのようなこのパラメータが含まれています

public class Global {
    public static String USER_ID = "";
    public static String USER_NAME = "";
    public static String USER_PASSWORD = "";
}

ログイン時にUSER_ID一度設定します(例:Global.USER_ID = "12345")。そして、バックグラウンドで実行されているスレッドは、5分ごとにいくつかのデータ(これを含むUSER_ID)をWebサービスに投稿します。

問題は、スレッドが長時間(約1日)実行されている場合です。パラメータUSER_IDが「12345」ではなく「」に戻ることがわかりました。

なぜ???

誰か知ってる?

4

3 に答える 3

2

あなたのクラスは(GC中に)クラスローダーによってメモリから削除され、次にグローバルクラスを使用するときにロードされると思います。

私の提案は、これにSingeltonクラスを使用することです。

public class Global {
    public String USER_ID = "";
    public String USER_NAME = "";
    public String USER_PASSWORD = "";

    //constructor 
   private Global(){
    // just to prevent object creation from outside
   }
    //static reference
    public static Global global=null;
    public Global getInstance(){    
     return ((global!=null)? global : (global=new Global()) ;
    }
}

これで、このクラスを使用する場所ならどこでもこのオブジェクトを取得できます。単一のロジックにより、すべてのオブジェクト間で共有される唯一のオブジェクトであることが保証されます。

を使用してスレッドで参照を取得できます

global = Global.getInstance();

これで、変数を使用できます。つまり、global.USER_IDを使用してUSER_IDを使用できます。

グローバルオブジェクトの参照があるため、スレッドが有効になるまで、GCはそれをメモリから削除しません。

説明のためだけにパブリック変数を使用しましたが、ほとんどの場合、これらは推奨されていません。

編集

ユーザーデータを保存するには、 SharedPreferencesをお勧めします。次のように使用できます。-

private final String YourAppName_PREFS_NAME = "chooseAMeaningFulName";
private final String YourAppName_USERNAME = "username";
private final String YourAppName_PASSWORD = "password";

 /*This function will save the user name and password for providing Automatically login in future*/

       public void saveUserData() {
          if ( rememberMeChckbox.isChecked() ) {
            //      Log.i("loginFrag", "Saving userName: Pass " + userName + " : " + password);
            loginActivity.getSharedPreferences(YourAppName_PREFS_NAME, Context.MODE_PRIVATE).edit().putString(YourAppName_USERNAME, userName)
                  .putString(YourAppName_PASSWORD, password).commit();
          } else {
            loginActivity.getSharedPreferences(YourAppName_PREFS_NAME, Context.MODE_PRIVATE).edit().remove(RBR_USERNAME).remove(RBR_PASSWORD).commit();
          }
        }

        /*This function returns the previous data from the SharedPreferences and fills the UserName and Password Text Box*/
        private void getPreviousUserData() {
          SharedPreferences preferences = loginActivity.getSharedPreferences(YourAppName_NAME, Context.MODE_PRIVATE);
          userName = preferences.getString(YourAppName_USERNAME, null);
          password = preferences.getString(YourAppName_PASSWORD, null);
          //      Log.i("loginFrag", "Got userName: Pass " + userName + " : " + password);
          if ( userName != null ) {
            uText.setText(userName);
          } else {
            uText.setText("android");
          }
          if ( password != null ) {
            passText.setText(password);
          } else {
            passText.setText("android");
          }
        }
于 2012-11-02T05:26:46.950 に答える
1
public class Credentials {
    private Context context;
    private  final String USERID = "USER_ID";
    private final String USER_NAME = "USER_NAME";
    private  final String PASSWORD = "Password";
    private  final String KEY="SaveCredentials";


     public Credentials(Context mcontext) {
        super();
        this.context = mcontext;
    }


    public boolean saveCredentials(String userId,String password,String UserName) {
            Editor editor = context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit();
            editor.putString(USERID,userId);
            editor.putString(USER_NAME,UserName);
                editor.putString(PASSWORD,password);
            return editor.commit();
        }
    public ArrayList<String> restoreCredentials() {
        ArrayList<String> credentials=new ArrayList<String>();
        SharedPreferences sharedPreferences = context.getSharedPreferences(KEY, Context.MODE_PRIVATE);

       String userid= sharedPreferences.getString(USERID, null);
    String userName=sharedPreferences.getString(USER_NAME,null);
     String password=sharedPreferences.getString(PASSWORD,null);
       credentials.add(userid);
      credentials.add(userName);
       credentials.add(password);
        return credentials;
    }
   public void deleteCredentials()
   {
       Editor editor = context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit();
    editor.clear();
    editor.commit();
   }

}
于 2012-11-02T05:27:21.547 に答える
0
public class UserDetail {
    public String USER_ID = "";
    public String USER_NAME = "";
    public String USER_PASSWORD = "";

    public static void setUSER_ID(String USER_ID)
    {
        this.USER_ID = USER_ID;
    }

    public static String getUSER_ID()
    {
        return USER_ID;
    }   
}

あなたのGlobals Class宣言で

public static UserDetail userDetails = new UserDetail();

コードで最初に次のような値を設定します

Globals.userDetals.setUSER_ID("12345");

同じLikeから値を取得します

String USER_ID = Globals.userDetails.getUSER_ID();
于 2012-11-02T05:25:56.370 に答える