tamrezh21 tamrezh21 - 26 days ago 7
Android Question

App Crashes while trying to change the network connectivity android

In my app, I have created an activity where I am using a webview to show one web page. I have created a class named NetworkReceiver which extends BroadcastReceiver. I am using this class to notify the user when there is no internet connection or when connecting again a mobile network or wifi connection. But the problem I am getting the app crashes for this network receiver when changing the network connectivity. Most surprising thing is this does not happen all the time. sometimes the app is completely closed and that time when I try to connect the internet, I am getting app crashing. Here is my complete code for webview activity with network receiver class

public class JobPage extends AppCompatActivity {

public static WebView webView;
private static final String URL = "https://.....";


public static boolean refreshDisplay = true;

// The BroadcastReceiver that tracks network connectivity changes.
private NetworkReceiver receiver = new NetworkReceiver();

Constant constant;
SharedPreferences app_preferences;
int appTheme;
int themeColor;
int appColor;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.job_layout);

webView = (WebView) findViewById(R.id.webView);
webView.loadUrl(URL);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());

// Registers BroadcastReceiver to track network connection changes.
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
receiver = new NetworkReceiver();
this.registerReceiver(receiver, filter);

}

@Override
protected void onStop()
{
unregisterReceiver(receiver);
super.onStop();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

if (id == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}

/**
* Created by mnowshin on 16/08/2017.
*/

public static class NetworkReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager conn = (ConnectivityManager)
context.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = conn.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
// If device has its Wi-Fi connection, sets refreshDisplay
// to true. This causes the display to be refreshed when the user
// returns to the app.

Toast.makeText(context, "Wi-fi is connected", Toast.LENGTH_SHORT).show();
//JobPage.refreshDisplay = true;
webView.reload();

// If the setting is ANY network and there is a network connection
// (which by process of elimination would be mobile), sets refreshDisplay to true.
} else if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
Toast.makeText(context, "Mobile is connected", Toast.LENGTH_SHORT).show();
//JobPage.refreshDisplay = true;
webView.reload();

// Otherwise, the app can't download content--either because there is no network
// connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there
// is no Wi-Fi connection.
// Sets refreshDisplay to false.
}
else if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
Toast.makeText(context, "Data is connected", Toast.LENGTH_SHORT).show();
//JobPage.refreshDisplay = true;
webView.reload();
}
else {
refreshDisplay = false;
Toast.makeText(context, "Your internet connection is not availbale", Toast.LENGTH_SHORT).show();
}
}
}


}

09-21 15:03:57.500 12346-12346/demo.app.com.bluapp_client_and D/TimaKeyStoreProvider: TimaSignature is unavailable
09-21 15:03:57.500 12346-12346/demo.app.com.bluapp_client_and D/ActivityThread: Added TimaKeyStore provider
09-21 15:03:57.650 12346-12346/demo.app.com.bluapp_client_and D/AndroidRuntime: Shutting down VM
09-21 15:03:57.650 12346-12346/demo.app.com.bluapp_client_and E/AndroidRuntime: FATAL EXCEPTION: main
Process: demo.app.com.bluapp_client_and, PID: 12346
java.lang.RuntimeException: Unable to start receiver demo.app.com.bluapp_client_and.activity.job.JobPage$NetworkReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.reload()' on a null object reference
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3641)
at android.app.ActivityThread.access$2000(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1876)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.reload()' on a null object reference
at demo.app.com.bluapp_client_and.activity.job.JobPage$NetworkReceiver.onReceive(JobPage.java:174)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3634)
at android.app.ActivityThread.access$2000(ActivityThread.java:221) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1876) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7225) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)


 

Manifest

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="demo.app.com.bluapp_client_and">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="23" />

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



....

<receiver android:name="demo.app.com.bluapp_client_and.activity.job.JobPage$NetworkReceiver">
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>



Answer Source

I use this for internet connection

Create a class...

    public class InternetStatus {
    private static InternetStatus instance = new InternetStatus();
    static Context context;
    ConnectivityManager connectivityManager;
    NetworkInfo wifiInfo, mobileInfo;
    boolean connected = false;

    public static InternetStatus getInstance(Context ctx) {
        context = ctx.getApplicationContext();
        return instance;
    }

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

            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            connected = networkInfo != null && networkInfo.isAvailable() &&
                    networkInfo.isConnected();
            return connected;


        } catch (Exception e) {
            System.out.println("CheckConnectivity Exception: " + e.getMessage());
            Log.v("connectivity", e.toString());
        }
        return connected;
    }
}

Then I can call it where ever in the app.

    if (InternetStatus.getInstance(getApplicationContext()).isOnline()) {
        //User is online
    } else {
        //User is not online
    }