Search code examples
androidoffline-cachingevent-listener

Show Network Error in android


I have created appliction with webview. if i have do any action and the net is disconnected i want to display one alert. I have tried the following,

added this in oncreate method.

public class AndroidNetTestActivity extends Activity {

    public static WebView webview;
    private Handler mHandler = new Handler();       
    private boolean isConnected = true;
    final String offlineMessageHtml = "Net is disconnected";
    final String timeoutMessageHtml = "Connection timed out";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        webview=(WebView)findViewById(R.id.webview);
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.loadUrl("file:///android_asset/www/index.htm");      
        webview.addJavascriptInterface(new MyJavaScriptInterface(), "Android");
        isConnected=isNetworkAvailable();
        webview.setNetworkAvailable(isConnected);
        webview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                isConnected=isNetworkAvailable();
                if (isConnected) {
                    // return false to let the WebView handle the URL
                    return false;
                } else {
                    // show the proper "not connected" message
                    view.loadData(offlineMessageHtml, "text/html", "utf-8");
                    // return true if the host application wants to leave the current 
                    // WebView and handle the url itself
                    return true;
                }
            }
            @Override
            public void onReceivedError (WebView view, int errorCode, 
                String description, String failingUrl) {
                if (errorCode == ERROR_TIMEOUT) {
                    view.stopLoading();  // may not be needed
                    view.loadData(timeoutMessageHtml, "text/html", "utf-8");
                }
            }
        });
        webview.setWebChromeClient(new WebChromeClient());        
    }

    final class MyJavaScriptInterface
    {
        public void ProcessJavaScript(final String scriptname, final String args)
            {             
                mHandler.post(new Runnable()
                    {
                        public void run()
                            {
                                //ToDo
                            }
                    });
            }
    }  

    public boolean isNetworkAvailable() {
           Context context = getApplicationContext();
           ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
           if (connectivity == null) {
              //boitealerte(this.getString(R.string.alert),"getSystemService rend null");
           } else {
              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;
        }
}

if i clicking on the log in button, it should show an error message if net is not available.

but it is not working. please check my code and tell me what i did wrong


Solution

  • ok... i updated your code. just have a look

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.graphics.Bitmap;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.os.Handler;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;
    
    
    public class AndroidNetTestActivity extends Activity {
    
        public static WebView webview;
        private Handler mHandler = new Handler();       
        private boolean isConnected = true;
        final String offlineMessageHtml = "Net is disconnected";
        final String timeoutMessageHtml = "Connection timed out";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.full_screen_image_layout);
    
            webview=(WebView)findViewById(R.id.webview);
            webview.getSettings().setJavaScriptEnabled(true); 
            webview.loadUrl("http://www.google.com");      
            webview.addJavascriptInterface(new MyJavaScriptInterface(), "Android");
            isConnected=isNetworkAvailable();
            webview.setNetworkAvailable(isConnected);
            webview.setWebViewClient(new WebViewClient() {
                /* (non-Javadoc)
                * @see android.webkit.WebViewClient#onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap)
                */
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    System.out.println("page loading started");
                    // TODO Auto-generated method stub
                    if(!isNetworkAvailable2())
                    {
                        showInfoMessageDialog("network not available");
                        System.out.println("network not available");
                        return;
                    }
                    else System.out.println("network available");
    
                    super.onPageStarted(view, url, favicon);
    
                }
    
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    isConnected=isNetworkAvailable2();
                    if (isConnected) {
                        // return false to let the WebView handle the URL
                        return false;
                    } else {
                        // show the proper "not connected" message
                    // view.loadData(offlineMessageHtml, "text/html", "utf-8");
                        // return true if the host application wants to leave the current 
                        // WebView and handle the url itself
                        return true;
                    }
                }
                @Override
                public void onReceivedError (WebView view, int errorCode, 
                    String description, String failingUrl) {
                    if (errorCode == ERROR_TIMEOUT) {
                        view.stopLoading();  // may not be needed
                    // view.loadData(timeoutMessageHtml, "text/html", "utf-8");
                    }
                }
            });
            //webview.setWebChromeClient(new WebChromeClient());        
        }
    
        final class MyJavaScriptInterface
        {
            public void ProcessJavaScript(final String scriptname, final String args)
                {             
                    mHandler.post(new Runnable()
                        {
                            public void run()
                                {
                                    //ToDo
                                }
                        });
                }
        }  
    
        private void showInfoMessageDialog(String meaasge)
        {
            AlertDialog alertDialog = new AlertDialog.Builder(
                    AndroidNetTestActivity.this).create();
            alertDialog.setTitle("Connectivity");
            alertDialog.setMessage(meaasge);
            alertDialog.setButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int which) {
                            dialog.cancel();
                        }
                    });
            //alertDialog.setIcon(R.drawable.error);
            alertDialog.show();
        }
    
        private boolean isNetworkAvailable2()
        {
            System.out.println("isNetworkAvailable2 called");
            NetworkInfo info = (NetworkInfo) ((ConnectivityManager) getApplicationContext()
                    .getSystemService(Context.CONNECTIVITY_SERVICE))
                    .getActiveNetworkInfo();
    
            if (info == null || !info.isAvailable() || !info.isConnected())
                return false;
            else return true;
        }
    
    
        public boolean isNetworkAvailable() {
            Context context = getApplicationContext();
            ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (connectivity == null) {
                //boitealerte(this.getString(R.string.alert),"getSystemService rend null");
            } else {
                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;
            }
    }