尝试更改网络连接时应用程序崩溃 android
App Crashes while trying to change the network connectivity android
在我的应用程序中,我创建了一个 activity,我在其中使用 webview 来显示一个网页。我创建了一个名为 class 的 NetworkReceiver,它扩展了 BroadcastReceiver。当没有互联网连接或再次连接移动网络或 wifi 连接时,我正在使用此 class 通知用户。但是当更改网络连接时,我遇到的问题是此网络接收器的应用程序崩溃。最令人惊讶的是这并非一直发生。有时应用程序完全关闭,当我尝试连接互联网时,应用程序崩溃了。这是我使用网络接收器 class
的 webview activity 的完整代码
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.access00(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.access00(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>
我用它来连接互联网
创建 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;
}
}
然后我可以在应用程序的任何地方调用它。
if (InternetStatus.getInstance(getApplicationContext()).isOnline()) {
//User is online
} else {
//User is not online
}
它说 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.reload()' on a null object reference
如果 id 正确
,可能是这条线造成了 problem.Check
webView = (WebView) findViewById(R.id.webView);
在执行操作之前加载 webview 之前检查 NullPointerException
if(null!=webView){
//Do the operation
}
在我的应用程序中,我创建了一个 activity,我在其中使用 webview 来显示一个网页。我创建了一个名为 class 的 NetworkReceiver,它扩展了 BroadcastReceiver。当没有互联网连接或再次连接移动网络或 wifi 连接时,我正在使用此 class 通知用户。但是当更改网络连接时,我遇到的问题是此网络接收器的应用程序崩溃。最令人惊讶的是这并非一直发生。有时应用程序完全关闭,当我尝试连接互联网时,应用程序崩溃了。这是我使用网络接收器 class
的 webview activity 的完整代码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.access00(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.access00(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>
我用它来连接互联网
创建 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;
}
}
然后我可以在应用程序的任何地方调用它。
if (InternetStatus.getInstance(getApplicationContext()).isOnline()) {
//User is online
} else {
//User is not online
}
它说 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.reload()' on a null object reference
如果 id 正确
,可能是这条线造成了 problem.CheckwebView = (WebView) findViewById(R.id.webView);
在执行操作之前加载 webview 之前检查 NullPointerException
if(null!=webView){
//Do the operation
}