应用程序在尝试更改网络连接android时崩溃

时间:2017-09-21 13:13:03

标签: android broadcastreceiver android-webview network-state

在我的应用中,我创建了一个活动,我使用webview来显示一个网页。我创建了一个名为NetworkReceiver的类,它扩展了BroadcastReceiver。我正在使用此课程在没有互联网连接或再次连接移动网络或wifi连接时通知用户。但是当我改变网络连接时,我收到应用程序的问题会崩溃。最令人惊讶的是这不会一直发生。有时应用程序完全关闭,当我尝试连接互联网时,我的应用程序崩溃。这是我使用网络接收器类

的webview活动的完整代码
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 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>

2 个答案:

答案 0 :(得分:1)

我用这个用于互联网连接

创建一个类......

    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;
    }
}

然后我可以在app中的任何地方调用它。

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

答案 1 :(得分:0)

它表示由以下原因引起:java.lang.NullPointerException:尝试调用虚方法&#39; void android.webkit.WebView.reload()&#39;在空对象引用上

可能是这一行没有问题。检查id是否正确

webView = (WebView) findViewById(R.id.webView);

在加载webview进行操作之前检查NullPointerException

if(null!=webView){
 //Do the operation     
}