Jack
Jack

Reputation: 2053

Checking if there's an internet connection before executing code

I would like to know if there's a simple way to check if the user has an internet connection available before executing some of my code.

I would like to know this because if I don't enable my internet connection then click "Setwallpaper", the app crashes because of "Nullpointerexception" because there is nothing there to execute.

How would I check if the user has an internet connection enabled before opening my Async task class that download and sets the wallpaper?

Code:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

    case R.id.SetWallpaper:

//Do something here that checks if the user has connection so if they don't, it won't execute this code here.

        new SaveWallpaperAsync(getActivity()).execute(mImageUrl);

        break;

    case R.id.SaveWallpaper:

//Do something here that checks if the user has connection so if they don't, it won't execute this code here.

        new SetWallpaperAsync(getActivity()).execute(mImageUrl);

        break;
    }
    return super.onOptionsItemSelected(item);
} 

Upvotes: 0

Views: 856

Answers (5)

Hiren Patel
Hiren Patel

Reputation: 52800

    public static boolean isInternetAvailable(Context ctx) {
            ConnectivityManager cm = (ConnectivityManager) ctx
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnectedOrConnecting()
                    && cm.getActiveNetworkInfo().isAvailable()
                    && cm.getActiveNetworkInfo().isConnected()) {
                return true;
            } else {
                return false;
            }
        }
public static void showNetworkAlertDialog(Context mCtx) {
    AlertDialog.Builder builder = new AlertDialog.Builder(mCtx);
    builder.setCancelable(false);
    builder.setTitle("Network Error");
    builder.setMessage("Internet is not available !!");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    builder.create().show();
}

//than

   if(isInternetAvailable){
    // Execute code here
    }else{
   NetworkUtils.showNetworkAlertDialog(mContext);
    }

// permission in manifest

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

Upvotes: 0

user2753324
user2753324

Reputation: 11

you need to write below code in your oncreate() or onStart()

    CheckConnection ch = new CheckConnection();
    boolean status = ch.isNetworkAvailable(getApplicationContext());

    if (status) {

        //do Async task





    } else {
        // show error
    }


       public class CheckConnection {

    public boolean isNetworkAvailable(Context context) {            
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {             
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {                 
                for (int i = 0; i < info.length; i++) {                       
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {                            
                        return true;
                    }
                }
            }
        }
        return false;
    }

}

Upvotes: 1

Chintan Soni
Chintan Soni

Reputation: 25267

This is how i did. Write the below code in onCreate() in the activity in which you want to check internet connection:

        NetworkConnectivity.sharedNetworkConnectivity().configure(this); 
        NetworkConnectivity.sharedNetworkConnectivity().startNetworkMonitor(); 
        NetworkConnectivity.sharedNetworkConnectivity() 
                .addNetworkMonitorListener(new NetworkMonitorListener() { 
                    @Override
                    public void connectionCheckInProgress() { 
                        // Okay to make UI updates (check-in-progress is rare) 
                    } 

                    @Override
                    public void connectionEstablished() { 
                        // Okay to make UI updates -- do something now that 
                        // connection is avaialble 


                    } 

                    @Override
                    public void connectionLost() { 
                        // Okay to make UI updates -- bummer, no connection 

                        Toast.makeText(getBaseContext(), "Connection lost. You cannot use Voice Input method.", Toast.LENGTH_LONG).show(); 


                    } 
                }); 

Create two java files:

NetworkConnectivity.java

package com.connectivity; 

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

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Handler; 

public class NetworkConnectivity { 

    private static NetworkConnectivity sharedNetworkConnectivity = null; 

    private Activity activity = null; 

    private final Handler handler = new Handler(); 
    private Runnable runnable = null; 

    private boolean stopRequested = false; 
    private boolean monitorStarted = false; 

    private static final int NETWORK_CONNECTION_YES = 1; 
    private static final int NETWORK_CONNECTION_NO = -1; 
    private static final int NETWORK_CONNECTION_UKNOWN = 0; 

    private int connected = NETWORK_CONNECTION_UKNOWN; 

    public static final int MONITOR_RATE_WHEN_CONNECTED_MS = 5000; 
    public static final int MONITOR_RATE_WHEN_DISCONNECTED_MS = 1000; 

    private final List<NetworkMonitorListener> networkMonitorListeners = new ArrayList<NetworkMonitorListener>(); 

    private NetworkConnectivity() { 
    } 

    public synchronized static NetworkConnectivity sharedNetworkConnectivity() { 
        if (sharedNetworkConnectivity == null) { 
            sharedNetworkConnectivity = new NetworkConnectivity(); 
        } 

        return sharedNetworkConnectivity; 
    } 

    public void configure(Activity activity) { 
        this.activity = activity; 
    } 

    public synchronized boolean startNetworkMonitor() { 
        if (this.activity == null) { 
            return false; 
        } 

        if (monitorStarted) { 
            return true; 
        } 

        stopRequested = false; 
        monitorStarted = true; 

        (new Thread(new Runnable() { 
            @Override
            public void run() { 
                doCheckConnection(); 
            } 
        })).start(); 

        return true; 
    } 

    public synchronized void stopNetworkMonitor() { 
        stopRequested = true; 
        monitorStarted = false; 
    } 

    public void addNetworkMonitorListener(NetworkMonitorListener l) { 
        this.networkMonitorListeners.add(l); 
        this.notifyNetworkMonitorListener(l); 
    } 

    public boolean removeNetworkMonitorListener(NetworkMonitorListener l) { 
        return this.networkMonitorListeners.remove(l); 
    } 

    private void doCheckConnection() { 

        if (stopRequested) { 
            runnable = null; 
            return; 
        } 

        final boolean connectedBool = this.isConnected(); 
        final int _connected = (connectedBool ? NETWORK_CONNECTION_YES 
                : NETWORK_CONNECTION_NO); 

        if (this.connected != _connected) { 

            this.connected = _connected; 

            activity.runOnUiThread(new Runnable() { 
                @Override
                public void run() { 
                    notifyNetworkMonitorListeners(); 
                } 
            }); 
        } 

        runnable = new Runnable() { 
            @Override
            public void run() { 
                doCheckConnection(); 
            } 
        }; 

        handler.postDelayed(runnable, 
                (connectedBool ? MONITOR_RATE_WHEN_CONNECTED_MS 
                        : MONITOR_RATE_WHEN_DISCONNECTED_MS)); 
    } 

    public boolean isConnected() { 
        try { 
            ConnectivityManager cm = (ConnectivityManager) activity 
                    .getSystemService(Context.CONNECTIVITY_SERVICE); 
            NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

            if (netInfo != null && netInfo.isConnected()) { 
                return true; 
            } else { 
                return false; 
            } 
        } catch (Exception e) { 
            return false; 
        } 
    } 

    private void notifyNetworkMonitorListener(NetworkMonitorListener l) { 
        try { 
            if (this.connected == NETWORK_CONNECTION_YES) { 
                l.connectionEstablished(); 
            } else if (this.connected == NETWORK_CONNECTION_NO) { 
                l.connectionLost(); 
            } else { 
                l.connectionCheckInProgress(); 
            } 
        } catch (Exception e) { 
        } 
    } 

    private void notifyNetworkMonitorListeners() { 
        for (NetworkMonitorListener l : this.networkMonitorListeners) { 
            this.notifyNetworkMonitorListener(l); 
        } 
    } 

} 

NetworkMonitorListener.java

package com.connectivity; 

public interface NetworkMonitorListener { 

    public void connectionEstablished(); 
    public void connectionLost(); 
    public void connectionCheckInProgress(); 
} 

And finally, add these two lines in your manifest.xml:

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

Upvotes: 0

GrIsHu
GrIsHu

Reputation: 23638

Try out as below :

public static boolean IsNetConnected() {
    boolean NetConnected = false;

    try {
        ConnectivityManager connectivity = (ConnectivityManager) m_context
                .getSystemService(m_context.CONNECTIVITY_SERVICE);

        if (connectivity == null) {
            NetConnected = false;
        } else {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();

            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        NetConnected = true;
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        NetConnected = false;
    }

    return NetConnected;
}

and also add the permissions in your manifest.

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

In your code do as below:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

    case R.id.SetWallpaper:

//Do something here that checks if the user has connection so if they don't, it won't execute this code here.
        if( IsNetConnected())
        {
            new SaveWallpaperAsync(getActivity()).execute(mImageUrl);
         }
        break;

    case R.id.SaveWallpaper:

//Do something here that checks if the user has connection so if they don't, it won't execute this code here.
        if( IsNetConnected())
        {
            new SetWallpaperAsync(getActivity()).execute(mImageUrl);
          }
        break;
    }
    return super.onOptionsItemSelected(item);
} 

Upvotes: 0

Apoorv
Apoorv

Reputation: 13520

Use this method

public static boolean checkInternetConnection(Context context)
{
    try
    {
        ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        // ARE WE CONNECTED TO THE NET

        if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() && conMgr.getActiveNetworkInfo().isConnected())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    return false;
}

and add the permissions

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

in your manifest file

Upvotes: 0

Related Questions