J'essaye maintenant de créer un programme de chat instagram en utilisant Firebase le problème est que je veux afficher l'état de connexion de ce membre mais le cycle de vie Android est un problème
Voici mon code HomeActiviy lorsque la connexion de l'utilisateur réussit, accédez à HomeActivty à partir de là, j'ai déterminé qu'en ligne ou hors ligne
C'est mon code qui distingue en ligne ou hors ligne
2019-07-09 16:46:29.993 13773-13773/com.example.blogapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.blogapp, PID: 13773 java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:323) at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:132) at com.bumptech.glide.Glide.with(Glide.java:741) at com.example.together.activities.chat.ChatsActivity$1.onDataChange(ChatsActivity.java:66) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75) at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63) at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
De mon HomeActivity. java lors du push chat ImageButton Aller à l'activité de chat et ils se voient le bouton d'image en ligne vert ou gris
Et voici mon problème Lorsque vous passez à une autre activité depuis HomeActivity l'état sera affiché hors ligne
et la deuxième fois lorsque je mettrai le bouton de chat
Voici mon activité de chat
package com.example.together.activities.chat; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.together.fragment.ChatFragment; import com.example.together.fragment.UsersFragment; import com.example.together.model.User; import com.example.together.R; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; 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.ValueEventListener; import java.util.ArrayList; import java.util.HashMap; import de.hdodenhof.circleimageview.CircleImageView; public class ChatsActivity extends AppCompatActivity { CircleImageView image_profile; TextView username; FirebaseUser firebaseUser; DatabaseReference reference; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setTitle(""); image_profile = findViewById(R.id.image_profile); username = findViewById(R.id.username); firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid()); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { User user = dataSnapshot.getValue(User.class); username.setText(user.getUsername()); if (user.getImageurl().equals("default")){ image_profile.setImageResource(R.mipmap.ic_launcher); }else { Glide.with(ChatsActivity.this).load(user.getImageurl()).into(image_profile); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); TabLayout tabLayout = findViewById(R.id.tab_layout); ViewPager viewPager = findViewById(R.id.view_pager); ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapter.addFragment(new ChatFragment(), "ì±í "); // `new ChatFragment()` should be inside `FragmentPagerAdapter.getItem()` viewPagerAdapter.addFragment(new UsersFragment(), "ì¹êµ¬ì°¾ê¸°"); // `new UsersFragment()` should be inside `FragmentPagerAdapter.getItem()` viewPager.setAdapter(viewPagerAdapter); tabLayout.setupWithViewPager(viewPager); } class ViewPagerAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> fragments; // this line can cause crashes private ArrayList<String> titles; ViewPagerAdapter(FragmentManager fm){ super(fm); this.fragments = new ArrayList<>(); this.titles = new ArrayList<>(); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } public void addFragment(Fragment fragment, String title){ fragments.add(fragment); // this line can cause crashes titles.add(title); } // Ctrl + O @Nullable @Override public CharSequence getPageTitle(int position) { return titles.get(position); } } }
3 Réponses :
Il semble que votre ChatsActivity
soit détruit pendant que Glide essaie de charger l'image. Vous pouvez utiliser getApplicationContext ()
pour obtenir le contexte actuel.
Essayez de remplacer,
Glide.with(getApplicationContext()).load(user.getImageurl()).into(image_profile);
par
Glide.with(ChatsActivity.this).load(user.getImageurl()).into(image_profile);
Vous devez également utiliser la méthode .onDisconnect ()
donnée par firebase pour vérifier la présence de l'utilisateur
Lorsque vous établissez une opération onDisconnect (), l'opération se trouve sur le serveur Firebase Realtime Database. Le serveur vérifie la sécurité pour s'assurer que l'utilisateur peut effectuer l'événement d'écriture demandé et informe votre application si elle n'est pas valide. Le serveur surveille ensuite la connexion. Si à un moment donné la connexion expire ou est activement fermée par le client Realtime Database, le serveur vérifie la sécurité une deuxième fois (pour s'assurer que l'opération est toujours valide), puis appelle l'événement.
Pour en savoir plus, consultez ce doc
Mettez cette dépendance dans votre fichier build.gradle
:
<application android:name=".MyApplication" ....> </application>
Ensuite, dans votre classe Application, utilisez ceci:
public class MyApplication extends Application implements LifecycleObserver { @Override public void onCreate() { super.onCreate(); ProcessLifecycleOwner.get().getLifecycle().addObserver(this); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) private void onAppBackgrounded() { Log.d("MyApp", "App in background"); } @OnLifecycleEvent(Lifecycle.Event.ON_START) private void onAppForegrounded() { Log.d("MyApp", "App in foreground"); } }
Chaque fois qu'un utilisateur est dans votre application, techniquement, il est en ligne. Donc, dans votre activité domestique, utilisez ceci:
@Override protected void onResume() { super.onResume(); myRef.child(uid).child("isOnline").setValue(true); //User back online }
et aussi je suggérerais d'ajouter pour remplacer onResume ():
@Override protected void onStart() { super.onStart(); myRef.child(uid).child("isOnline").setValue(true); myRef.child(uid).child("isOnline").onDisconnect().setValue(false); }
Assurez-vous de ajoutez une instruction if pour vérifier si l'utilisateur est connecté à Internet ou non!
À quelle ligne de code obtenez-vous cette erreur?