如何在Android中保持状态“在线" [英] How can i keep status 'online' in android
问题描述
现在我正在尝试使用Firebase制作像instagram聊天程序一样的程序 问题是我想显示该会员的登录状态 但是android的生命周期是个问题
Now i'm trying to make like a instagram chat program using firebase the problem is i want to show that member login status but android life cycle is problem
这是我的代码HomeActiviy 用户登录成功后,请转到HomeActivty 从这里我确定是在线还是离线
Here's my code HomeActiviy when user login success, go to HomeActivty from here i determined that online or offline
这是我的在线或离线代码,
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时 转到聊天活动 他们会看到彼此的在线图像按钮为绿色或灰色
From my HomeActivity.java when push chat ImageButton goto chat Activity and they see each other online image button green or gray
这是我的问题 当从HomeActivity转到另一个活动时 状态将显示为脱机
And here's my problem When go to another activity from HomeActivity the status will be show offline
第二次当我按下聊天按钮
and second time when i put the chat 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)
我认为这与活动的生命周期有关
i think it's related life cycle of activity
我如何保持身份?
推荐答案
将此依赖项放入您的build.gradle
文件中:
Put this dependency in your build.gradle
file:
implementation "android.arch.lifecycle:extensions:*"
然后在您的Application类中,使用此:
Then in your Application class, use this:
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文件:
Update your AndroidManifest.xml file:
<application
android:name=".MyApplication"
....>
</application>
当您的应用处于后台时,状态更改为
offline
;当应用处于前景时,其状态更改为online
.
When your app is in background change status to
offline
and when app is in foreground change it's status toonline
.
这篇关于如何在Android中保持状态“在线"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!