0

我有一个非常常见的问题,我认为每个 android 开发人员都会在某个时候面临。我正在制作一个从网络服务器加载数据的应用程序。因此,正在使用互联网连接。但是我必须在每次调用服务器之前检查互联网连接。我正在使用 ConnectivityManager 进行操作,并且可以正常工作。

我的问题实际上是关于在互联网连接丢失时通知用户。我想向用户显示一个 AlertDialog 框,告诉他失去了互联网连接。现在的问题是,如果用户单击一个按钮并且必须启动一个新的 Activity (这将从服务器加载数据),那么我无法向他显示调用 Activity 的对话框。这里的问题是,如果互联网不可用,我不想导航到其他活动。我只想继续参加这项活动。

这个活动上有很多按钮,点击它们,用户可以去不同的活动。如果没有可用的互联网,我想要的只是不打开其他活动,并仅向他显示此活动的对话框。一种方法是检查每个按钮的单击(在 onClick 方法中),然后通知用户有关丢失的 Internet 连接。但这对我来说可能非常忙碌,因为每个活动都有很多活动和很多按钮。

是否有一种通用且有效的方法来确定是否正在离开此活动并且正在启动新活动并在找到它后向用户显示对话框而不是在互联网不可用时移动到下一个活动。什么是最好的处理这个问题的做法。请帮我。在过去的两天里,我一直坚持这一点。提前谢谢。

 @Override
  public void onClick(View view) {
    switch(view.getId()){
       case R.id.backIcon:
           navigateMenuScreen(view);
           break;
    }
 }

这是我检查互联网连接的方法(它工作正常):

   ConnectivityManager connectivityManager   = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    if (networkInfo!=null && networkInfo.isConnected()) {
        return true;
    } else {
        return false; 
    }

这是导航方法:

    public void navigateMenuScreen(View view){
    try {           
        Intent loginIntent = new Intent(view.getContext(), MenuActivity.class);      
        startActivityForResult(loginIntent, 0);     
        overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);        
    } catch(Exception ex) {
    }
}

我的问题是我必须在每种导航方法中检查互联网连接(还有其他方法,如上述方法)还是有更好的方法?

4

2 回答 2

2

登记

   registerReceiver(mConnReceiver, 
       new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

听:

  private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
            String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
                        boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);

            NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

            // do application-specific task(s) based on the current network state, such 
            // as enabling queuing of HTTP requests when currentNetworkInfo is connected etc.
        }
    };

不要忘记你的清单文件

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2012-08-31T09:37:47.647 回答
1

可能的解决方案(假设您正在为 Android 3.0+ 开发)是使用AsyncTaskLoaderdocs)。这意味着当用户按下按钮时Activity1,您将启动一个“后台”任务来检索您的数据。当它成功下载数据后,它可以显示Actiivty2

这将保证数据在显示时Activity2显示,但不能保证Activity2立即显示(或根本不显示,取决于您的编写方式)

我不确定这是否是您所追求的,但值得一读。

于 2012-08-31T10:18:28.093 回答