1
votes

Comment puis-je garder le statut `` en ligne '' sur Android

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);
        }
    }



}


1 commentaires

À quelle ligne de code obtenez-vous cette erreur?


3 Réponses :


1
votes

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


0 commentaires

2
votes

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");
    }
}


0 commentaires

0
votes

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!


0 commentaires