Ниженаписанный код выполнется раньше вышенаписанного : и потому не могу получить fcm токен в переменную
У меня Ниженаписанный код выполнется раньше вышенаписанного . Не могу понять почему. Это видно по логам. Мне нужно в переменную FCM_token2 записать токен Firebase Messagining и использовать значение переменной в дальнейшем при регистрации пользователя. Но у меня получается получить токен только внутри метода onComplete, но не получается использовать токен вне метода, не получается использовать токен в переменной паблик (внутри одного класса),
Вот такой лог в логкате:
D FCM register token 55555 = FCM_token2 = null
D FCM register token 55555 token2 = com.google.android.gms.tasks.zzw@c0deb3e
D FCM register token 55555 внутри метода работает = dAHnU3XkYbOD6m2fc2Om4p:APA91bGZ50mhc5fmE9Jw71k4TOztLkl1RvJ2qNpjP892p9OIgks3F5NqXArPFbtYYNtCCCuoNSJSL_5xGBa5lNZvTYwKsGrEH1ftn4fw3nojYs9GS5mXBus
и вот содержимое REgisterActivity:
package dem.corp.androidmessenger;
import static androidx.fragment.app.FragmentManager.TAG;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.messaging.FirebaseMessaging;
import java.util.HashMap;
import java.util.Objects;
import dem.corp.androidmessenger.databinding.ActivityRegisterBinding;
public class RegisterActivity extends AppCompatActivity {
private ActivityRegisterBinding binding;
public String FCM_token2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityRegisterBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
SaveToken();
binding.signUpBtn.setOnClickListener(v -> {
if (binding.emailEt.getText().toString().isEmpty() || binding.passwordEt.getText().toString().isEmpty()
|| binding.usernameEt.getText().toString().isEmpty()){
Toast.makeText(getApplicationContext(), "Fields cannot be empty", Toast.LENGTH_SHORT).show();
}else{
//Проверка есть ли такой пользователь уже с таким Именем
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
final HashMap<String, Object> hashMap = new HashMap<>();
Query query = reference
.orderByChild("username")
// .equalTo("zzz333555");
.equalTo(binding.usernameEt.getText().toString());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.getChildrenCount()>0) {
//username found
Toast.makeText(getApplicationContext(), "Введите другое имя. С таким именемем есть пользователь", Toast.LENGTH_LONG).show();
System.exit(0);
}else{
// username not found
// hashMap.put("username", strUsername);
//reference.child(firebaseUser.getUid()).updateChildren(hashMap);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
FirebaseAuth.getInstance().createUserWithEmailAndPassword(binding.emailEt.getText().toString(), binding.passwordEt.getText().toString())
.addOnCompleteListener(task -> {
if (task.isSuccessful()){
Toast.makeText(getApplicationContext(), "Fregiter ", Toast.LENGTH_SHORT).show();
HashMap<String, String> userInfo = new HashMap<>();
userInfo.put("email", binding.emailEt.getText().toString());
userInfo.put("username", binding.usernameEt.getText().toString());
userInfo.put("profileImage", "");
userInfo.put("chats", "ZqnkGaeyk3UkRLRJH8Qh1tQiF7d3");
//userInfo.put("FCM_token", token2 );
FirebaseDatabase.getInstance().getReference().child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(userInfo);
//добавим тестовый чат
// String chatIdmyTest = generateChatId(uid, "1Sx2FCTKDcdfjhztPtTbWgSxFZP2");
String chatIdmyTest = "ZqnkGaeyk3UkRLRJH8Qh1tQiF7d3";
String uid = Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid();
HashMap<String, String> chatInfo = new HashMap<>();
chatInfo.put("user1", uid);
chatInfo.put("user2", "1Sx2FCTKDcdfjhztPtTbWgSxFZP2");
FirebaseDatabase.getInstance().getReference().child("Chats").child(chatIdmyTest)
.setValue(chatInfo);
Toast.makeText(getApplicationContext(), "Fregiter OK OK", Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterActivity.this, MainActivity.class));
}
else {
Toast.makeText(getApplicationContext(), "Введите LOGIN . С таким именемем есть пользователь", Toast.LENGTH_LONG).show();
}
});
}
});
}
public void SaveToken() {
//String token = String.valueOf(FirebaseMessaging.getInstance().getToken());
// Log.i(TAG, "FCM Registration Token: " + token);
//my test fcm
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
String FCM_token = task.getResult();
Log.d(TAG, "FCM register token 55555 внцутри = " + FCM_token);
// Log and toast
// String msg = getString(R.string.msg_token_fmt, token);
FCM_token2 = FCM_token;
// Toast.makeText(ProfileFragment.this, token, Toast.LENGTH_SHORT).show();
Log.d(TAG, "FCM register token 55555 = var FCM_token2" + FCM_token2);
//ут работает , выводит значение FCM_token2
// return FCM_token2;
}
});
//return;
// fcmpushnotificationshttpv1.PushNotificationService pushNotificationService = new fcmpushnotificationshttpv1.PushNotificationService();
// pushNotificationService.onNewToken();
// chatViewModel.sendMessage(false, "d-cIJH7gM598yE22mfCgJY:APA91bFD_rfYPnr6zoA9vlEtGftWl6R3y3DAqwB2I9pLX9BkpLy3HAhpTbPE42jVWSwhwAex0gqQmeiji0gbZWAAjokAL9BjJ-kl0Lhd6v_HbXjINWxPAng");
String token2 = String.valueOf(FirebaseMessaging.getInstance().getToken());
Log.d(TAG, "FCM register token 55555 = var FCM_token2 = " + FCM_token2);
//выдает null почячему то!!! хотя выше код работал.
Log.d(TAG, "FCM register token 55555 var token2 = " + token2);
//выдает null почячему то!!!
//Toast.makeText(getApplicationContext(), FCM_token, Toast.LENGTH_SHORT).show();
//end my test fcm
// FCM_token2 = FCM_token;
Log.d(TAG, "FCM register token 55555 = var FCM_token2222 ==== " + FCM_token2);
}
}
Я пробовал и внутри метода public void onComplete(@NonNull Task task) { приравнивать одну переменную к другой, но все равно не могу вне этого метода получить значение переменной.
Скажите , а почему переменная FCM_token2 у меня пустая? Верно ли понимаю,потому что сначала выполняется код :
String token2 = String.valueOf(FirebaseMessaging.getInstance().getToken());
Log.d(TAG, "FCM register token 55555 = var FCM_token2 = " + FCM_token2);
//выдает null почячему то!!! хотя выше код работал.
Log.d(TAG, "FCM register token 55555 var token2 = " + token2);
а только потом код в методе OnComplete? почему так?