2016-05-17 2 views
0

Я создаю приложение с облачными сообщениями Google. После того как я открыл приложение, моя основная деятельность (LoginActivity) регистрирует приложение и получает «токен регистрации GCM», я поместил следующую строку в RegistrationIntentService.Строка стала пустой после ее заполнения

sharedPreferences.edit().putString("token", token).apply(); 

Активность получает этот токен и отображает тост с токеном. Но после того, как я нажимаю кнопку (btn_login) маркер опустел ...
Это код в LoginActivity

private BroadcastReceiver mRegistrationBroadcastReceiver; 
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
private boolean isReceiverRegistered; 
private Context context; 
static String token; 
Button btn_login; 
EditText txt_GebruikersNaam, txt_Wachtwoord; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    context = getApplicationContext(); 
    btn_login = (Button)findViewById(R.id.btn_login); 
    txt_GebruikersNaam= (EditText)findViewById(R.id.txt_GebruikersNaam); 
    txt_Wachtwoord= (EditText)findViewById(R.id.txt_Wachtwoord); 

    btn_login.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String gebruikersnaam = txt_GebruikersNaam.getText().toString(); 
      String wachtwoord = txt_Wachtwoord.getText().toString(); 
      if(!gebruikersnaam.equals("") || !wachtwoord.equals("")) { 
       // HERE THE TOKEN IS EMPTY 
       String json = createJsonPost(gebruikersnaam, wachtwoord, token); 
      } 

     } 
    }); 
    token = getToken(); 
} 

private String getToken(){ 
    final String[] token = {""}; 
    mRegistrationBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
      boolean sentToken = sharedPreferences.getBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false); 
      if (sentToken) { 
       CharSequence text = sharedPreferences.getString("token",null); 
       Toast.makeText(context, text.toString(), Toast.LENGTH_SHORT).show(); 
       token[0] = text.toString(); 
      } else { 
       Toast.makeText(context, "Geen verbinding", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 

    // Registering BroadcastReceiver 
    registerReceiver(); 

    if (checkPlayServices()) { 
     // Start IntentService to register this application with GCM. 
     Intent intent = new Intent(this, RegistrationIntentService.class); 
     startService(intent); 
    } 
    return token[0]; 
} 

private void registerReceiver(){ 
    if(!isReceiverRegistered) { 
     LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 
       new IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE)); 
     isReceiverRegistered = true; 
    } 
} 

private String createJsonPost(String Naam, String Wachtwoord, String token){ 
    JSONObject jsonObject = new JSONObject(); 
    JSONObject jsonData = new JSONObject(); 

    jsonData.put("user", Naam); 
    jsonData.put("pass", Wachtwoord); 
    jsonData.put("token", token); 

    jsonObject.put("authorization", jsonData); 
} 
+0

где ваш ** сохранение токена в код предпочтений ** ?? –

+0

Не уверен, что это помогает, но вы сохраняете токен в 'token [0]', но ваша переменная является простой 'String'. Во-вторых, я не вижу места, где вы храните токен. – kazbeel

ответ

1

Это связано с тем, что ваш token = getToken(); запускается до запуска onReceive(Context context, Intent intent). Вы должны установить token в функции onReceive(Context context, Intent intent).

+0

Спасибо, что решил это .. Просто исправить, но после 3 часов работы в Интернете я просто не мог понять. Спасибо еще раз! – willemjan92

0

Ваша «маркер» Строка не может быть сохранена. Просто вызовите .commit() вместо метода apply() SharedPreferences.

+0

Я боюсь, что полностью не согласен с вами, поскольку 'commit()' - это синхронный вызов, которого следует избегать из потока пользовательского интерфейса. – kazbeel

+0

Зачем вам нужен доступ к сохраненному токену через BroadcastReceiver? – Seishin

Смежные вопросы