【问题标题】:How to listen to change in internet connection in my Android app?如何在我的 Android 应用程序中收听互联网连接的变化?
【发布时间】:2016-04-19 08:15:12
【问题描述】:

我已经创建了一个使用网络服务发送和检索 JSON 数据的 Android 应用。

当我在设备在线时发出请求时,它工作正常,但当设备离线时,应用程序卡住并打印 Null Pointer Exception 错误。

有没有办法收听互联网连接?

【问题讨论】:

  • 检查您的 wifi 连接,如果可用,请拨打服务器电话,否则显示对话框请启用网络
  • 我已经这样做了。但是当我运行进程并且连接在进程尚未完成时脱机时出现问题
  • 你使用什么服务器调用 Volley 库?
  • 使用 volley 库它不会让你的应用程序崩溃@Naham Soft
  • github.com/mcxiaoke/android-volley 使用这个 Volley 库

标签: php android json web-services


【解决方案1】:
  • 你可以通过这个检查它是否连接到互联网。

    private boolean isNetworkAvailable() { 
            ConnectivityManager manager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = manager.getActiveNetworkInfo();
            boolean isAvailable = false;
    
            if(networkInfo != null && networkInfo.isConnected()) {
                isAvailable = true;
    
            } 
    
            return isAvailable;
     }
    

【讨论】:

  • 这项工作仅在我开始请求服务时起作用,但在进程运行时它已停止服务。
  • 顺便感谢您的帮助
【解决方案2】:

从您的问题和 cmets 来看,如果在请求/响应过程中连接丢失,您可能会遇到问题。所以为了监听这个变化,你需要创建一个 BroadcastReceiver (NetworkStateReceiver) 来监听网络状态变化,如下所示: NetworkStateReceiver.java

package your.package.name;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import java.util.ArrayList;
import java.util.List;

public class NetworkStateReceiver extends BroadcastReceiver {
    // Listeners list
    protected List<NetworkStateReceiverListener> listeners;

    // Connection flag
    protected Boolean connected;

    /**
     * Public constructor
     */
    public NetworkStateReceiver() {
        listeners = new ArrayList<NetworkStateReceiverListener>();
        connected = null;
    }

    /**
     *
     * @param context  Context - Application context
     * @param intent  Intent - Manages application actions on network state changes
     */
    public void onReceive(Context context, Intent intent) {
        if(intent == null || intent.getExtras() == null) return;

        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = manager.getActiveNetworkInfo();

        if((ni != null) && ni.isConnected()) {
            connected = true;
        } else {
            connected = false;
        }

        mNotifyStateToAll();
    }

    /**
     * Notify the state to all needed methods
     */
    private void mNotifyStateToAll() {
        for(NetworkStateReceiverListener listener : listeners)
            mNotifyState(listener);
    }

    /**
     * Notify the network state
     * @param listener  NetworkStateReceiverListener - receives network state change
     */
    private void mNotifyState(NetworkStateReceiverListener listener) {
        if(connected == null || listener == null) return;

        if(connected == true) {
            listener.networkAvailable();
        } else {
            listener.networkUnavailable();
        }
    }

    /**
     * Add listener once it is needed
     * @param l  NetworkStateReceiverListener - receives network state change
     */
    public void addListener(NetworkStateReceiverListener l) {
        listeners.add(l);
        mNotifyState(l);
    }

    /**
     * Remove the listener once it is not needed anymore
     * @param l  NetworkStateReceiverListener - receives network state change
     */
    public void removeListener(NetworkStateReceiverListener l) {
        listeners.remove(l);
    }

    /**
     * Set interface to communicate with Main methods
     */
    public interface NetworkStateReceiverListener {
        public void networkAvailable();
        public void networkUnavailable();
    }
}

您的活动需要实现这一点:

public class MyActivity extends Activity implements NetworkStateReceiver.NetworkStateReceiverListener {
    // Receiver that detects network state changes
    private NetworkStateReceiver networkStateReceiver;
    private boolean mNetworkAvailable;

    ...
    // What ever the code you want or need
    ...

    /**
     * Call back for NetworkStateReceiver to set the network state to available
     */
    @Override
    public void networkAvailable() {
        Log.d(TAG, "I'm in, baby! Dance, dance revolution!");
        sNetworkAvailable = true;
        // Network available again do things here
    }

    /**
     * Call back for NetworkStateReceiver to set the network state to unavailable
     */
    @Override
    public void networkUnavailable() {
        Log.d(TAG, "I'm dancing with myself, noone can see me.");
        sNetworkAvailable = false;
        // Network broke, warn the user, or do alternative action
    }

    /**
     * Need to register the receiver
     */
    @Override
    public void onResume() {
        super.onResume();

        // Register the network state receiver to listen to network state change
        if (networkStateReceiver == null) {
            networkStateReceiver = new NetworkStateReceiver();
            networkStateReceiver.addListener(this);
            this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
        }
    }

    /**
     * Unregister the receiver as you do not need it anymore
     */
    @Override
    public void onDestroy() {
        super.onDestroy();

        // Remove network state receiver and listener as we don't need them at this point
        if (networkStateReceiver != null) {
            networkStateReceiver.removeListener(this);
            this.unregisterReceiver(networkStateReceiver);
            networkStateReceiver = null;
        }
    }

    ...
    // What ever the code you want or need
    ...

}

【讨论】:

    【解决方案3】:

    在请求网络服务之前调用这个方法

    private boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo NInfo = cm.getActiveNetworkInfo();
    
        if (NInfo != null && NInfo.isConnectedOrConnecting())
            return true;
        else
            return false;
    }
    
    if(isOnline()){
     // request the service 
     // but make sure that U have surrounded the calling web-service by try and catch
    try{
         // here make your request when the connection go offline the app will    catch   the error and ignore the process 
    }catch (Exception e) {
    }
    

    添加此权限

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    

    【讨论】:

    • 如果在请求过程中连接中断,它将失败。
    • 是的,它会失败。这就是逻辑。但应用不会卡住或中断
    • 这不是解决方案。永远不要使用 catch (Exception e),您应该始终捕获确切的异常。 Don't Catch Generic Exception
    • 我的兄弟很好用。当我们需要做一些事情来纠正错误时,我们会使用确切的异常,但在我的问题中,我什么都不用做,只是避免应用卡住
    【解决方案4】:

    在你的清单中添加权限

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    Java

    public boolean networkstatus() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
     }
    
    
    if(networkstatus())
    {
    // do your process
    }
    else
    {
    //alert message for no internet connection
    }
    

    【讨论】:

    • 在进程开始之前我已经这样做了,但是当设备离线并且进程没有完成时,应用程序继续出错
    【解决方案5】:

    由 (Seshu Vinay) 回答

    此方法检查手机是否已连接到互联网,如果已连接则返回 true:

    private boolean isNetworkConnected() {
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    
      return cm.getActiveNetworkInfo() != null;
     }
    

    在清单中,

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    编辑:此方法实际上检查设备是否连接到互联网(有可能它连接到网络但未连接到互联网)。

    public boolean isInternetAvailable() {
            try {
                InetAddress ipAddr = InetAddress.getByName("google.com"); //You can replace it with your name
    
                if (ipAddr.equals("")) {
                    return false;
                } else {
                    return true;
                }
    
            } catch (Exception e) {
                return false;
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2011-02-19
      • 2020-08-04
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多