0

Dans mon application, j'ai créé une activité dans laquelle j'utilise une page Web pour afficher une page Web. J'ai créé une classe nommée NetworkReceiver qui étend BroadcastReceiver. J'utilise cette classe pour informer l'utilisateur quand il n'y a pas de connexion Internet ou lors de la reconnexion d'un réseau mobile ou d'une connexion wifi. Mais le problème que je reçois l'application se bloque pour ce récepteur réseau lors de la modification de la connectivité réseau. La chose la plus surprenante est que cela n'arrive pas tout le temps. Parfois, l'application est complètement fermée et cette fois-ci lorsque j'essaie de me connecter à Internet, l'application tombe en panne. Voici mon code complet pour l'activité WebView avec classe récepteur réseauApp se bloque lors de la tentative de modification de la connectivité réseau android

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> 

+0

avez-vous ajouté l'autorisation dans le fichier manifeste –

+0

@NileshRathod Oui – tamrezh21

+0

affichez votre fichier manifeste –

Répondre

1

J'utilise cette connexion pour internet

Créer une classe ...

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

Ensuite, je peux l'appeler où jamais dans l'application.

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

Merci pour votre réponse, cela fonctionne – tamrezh21

+0

génial. Codage heureux. – DroiDev

+0

pourquoi me demandes-tu de faire ça? – DroiDev

0

Il dit Causée par: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle « vide android.webkit.WebView.reload() » sur un objet null référence

Peut-être cette ligne est casusing problem.Check si l'identifiant est propre

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

Vérifier NullPointerException avant le chargement WebView befor faire opération

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