Как я могу сохранить статус «онлайн» в Android - PullRequest
1 голос
/ 09 июля 2019

Теперь я пытаюсь сделать как программу чата Instagram, использующую Firebase, проблема в том, что я хочу показать, что статус входа пользователя, но жизненный цикл андроида является проблемой

Вот мой код HomeActiviy, когда вход в систему успешно, идина HomeActivty отсюда я определил, что онлайн или офлайн

Это мой код, который отличает онлайн или офлайн

    private void status(String status){
        reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("status", status);

        reference.updateChildren(hashMap);

    }

    @Override
    protected void onResume() {
        super.onResume();
        status("online");
    }


    @Override
    protected void onPause() {
        super.onPause();
        status("offline");
    }

От моего HomeActivity.java при нажатии чата ImageButton Перейти кАктивность чата, и они видят друг друга, кнопка онлайн-изображения зеленая или серая

И вот моя проблема. При переходе к другой активности из HomeActivity статус будет отображаться в автономном режиме

и во второй раз, когда я ставлю чат.button

Вот мой чат Активность

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(), "채팅");
        viewPagerAdapter.addFragment(new UsersFragment(), "친구찾기");

        viewPager.setAdapter(viewPagerAdapter);

        tabLayout.setupWithViewPager(viewPager);



    }


    class ViewPagerAdapter extends FragmentPagerAdapter {

        private ArrayList<Fragment> fragments;
        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);
            titles.add(title);
        }


        // Ctrl + O


        @Nullable
        @Override
        public CharSequence getPageTitle(int position) {
            return titles.get(position);
        }
    }



}

Вот моя ошибка

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)

Я думаю, что это связано жизньцикл активности

как мне сохранить статус?

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Поместите эту зависимость в ваш build.gradle файл:

implementation "android.arch.lifecycle:extensions:*"

Затем в своем классе приложений используйте это:

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

Обновите файл AndroidManifest.xml:

<application
    android:name=".MyApplication"
    ....>
</application>

Когда ваше приложение находится в фоновом режиме, измените статус на offline, а когда приложение находится на переднем плане, измените его статус на online.

Ссылка

1 голос
/ 09 июля 2019

Проблемы выглядят так, как будто ваш ChatsActivity уничтожен, пока Glide пытается загрузить изображение.Вы можете использовать getApplicationContext(), чтобы получить текущий контекст.Попробуйте заменить

Glide.with(ChatsActivity.this).load(user.getImageurl()).into(image_profile);

на

Glide.with(getApplicationContext()).load(user.getImageurl()).into(image_profile);

Кроме того, вы должны использовать метод .onDisconnect(), данный firebase, чтобы проверить наличие пользователя

Когда вы устанавливаете операцию onDisconnect (), она работает на сервере базы данных Firebase Realtime.Сервер проверяет безопасность, чтобы убедиться, что пользователь может выполнить запрошенное событие записи, и сообщает вашему приложению, если оно недействительно.Затем сервер контролирует соединение.Если в какой-то момент соединение прерывается или активно закрывается клиентом базы данных в реальном времени, сервер проверяет безопасность еще раз (чтобы убедиться, что операция все еще действительна), а затем вызывает событие.

Вы можете узнать больше из этого документ

...