android - 在没有互联网的设备上通过 Firebase 隐藏 ProgressDialog

标签 android firebase firebase-realtime-database

我有这个场景:

  • 显示进度对话框。
  • 调用 Firebase。
  • 获取数据后隐藏进度对话框

完美运行,但是当设备没有互联网连接时问题就来了,在这种情况下进度对话框总是显示,当设备没有互联网时我想做的是关闭进度并显示一条错误消息。

这是我的代码:

showProgessDialog();
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("hello");
        DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");

        connectedRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                boolean connected = snapshot.getValue(Boolean.class);
                if (connected) {
                    Log.d(Constans.LOG,"1.- datachange connected");
                    hideProgressDialog();
                } else {
                    Log.d(Constans.LOG,"2.- datachange disconnected");
                    showProgessDialog();
                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
                System.err.println("3.- datachange cancelled");
            }
        });

        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.d(Constans.LOG,"4.- myRef addListenerForSingleValueEvent onDataChange");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d(Constans.LOG,"5.- myRef addListenerForSingleValueEvent cancell");
            }
        });


        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.d(Constans.LOG,"6.- myRef addValueEventListener onDataChange");
                String value = dataSnapshot.getValue(String.class);
                mAboutMe.setText(value);
            }
            @Override
            public void onCancelled(DatabaseError error) {
                Log.d(Constans.LOG,"7.- myRef addValueEventListener error"+error.getDetails());

            }
        });

如您所见,所有调用的方法在日志行中都有一个编号,当设备有互联网时,方法调用顺序为:

2,1,6,4

没有网络的时候就调用

2

我无法在打开它的地方关闭进度。

知道我可以使用 Firebase 框架做什么吗?

最佳答案

您可以使用此类的 isConnected 方法检查设备的互联网连接。然后在没有互联网连接时关闭进度对话框

public class InternetConnectionDetector
{
   private Context context;

   public InternetConnectionDetector(Context context)
   {
       this.context = context;
   }

   public boolean isConnected()
   {
       ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

       //There are changes after apk lollipop while detecting internet connection:
       //if user's os newer then lollipop:
       if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
       {
           Network[] networks = connectivityManager.getAllNetworks();
           NetworkInfo networkInfo;

           for(Network mNetwork : networks)
           {
               networkInfo = connectivityManager.getNetworkInfo(mNetwork);

               if(networkInfo.getState().equals(NetworkInfo.State.CONNECTED))
               {
                   return true;
               }
           }
       }

       //if user's os older then lollipop:
       else
       {
           //getAllNetworkInfo method work for only before API 19:
           NetworkInfo[] info = connectivityManager.getAllNetworkInfo();

           if(info != null)
           {
               for(NetworkInfo anInfo : info)
               {
                   if(anInfo.getState() == NetworkInfo.State.CONNECTED)
                   {
                       return true;
                   }
               }
           }
       }

       return false;
   }
}

关于android - 在没有互联网的设备上通过 Firebase 隐藏 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740206/

相关文章:

firebase - 如何使用 firebase auth 在 flutter 中添加用户个人资料图片

javascript - 如何使用 Node.js 在 Firebase 中注册用户?

java - 使用用户名引用将数据保存到 Firebase

java - 使用自定义 android.bluetooth。而不是 android studio 中默认 sdk android.jar 中存在的一个

android - 如何使背景大于屏幕并旋转它?

ios - 如何将多个数据写入firebase?

java - 我如何使用从 TextView 中的 firebaseDB 检索到的标签解析 HTML 文本?无网页 View

android - 在操作栏 ShareActionProvider 上设置自定义共享图标

java - Android - Java 服务器 AES 加密不起作用 - 不同的 key

ios - 在 Firestore 中使用降序时间戳进行分页