如何在连接到Internet后自动刷新webview

时间:2017-08-16 10:01:14

标签: android webview android-webview auto-update android-internet

在我的应用程序中,我实现了一个webview来显示一个包含一些有用信息的网页。现在我最初检查了Netwotk是否可用。如果availbale它将连接到网页。如果没有,它将显示alertdialog,告知您的设备没有互联网连接。之后,它将重定向到设置选项。我可以通过这个选项在wifi上切换。但问题是在打开wifi后,当我回到作业页面时,它不会自动更新。我必须转到我的选项菜单页面,然后单击按钮,然后更新。如何在打开互联网后像谷歌浏览器一样更新页面。这是我的代码

我编辑的代码

    public class JobPage extends AppCompatActivity {

    private WebView webView;

    public static final String WIFI = "Wi-Fi";
    public static final String ANY = "Any";
    private static final String URL = "https://app.com";

    private static boolean wifiConnected = false;
    private static boolean mobileConnected = false;
    public static boolean refreshDisplay = true;

    public static String sPref = null;

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


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

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

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        // Unregisters BroadcastReceiver when app is destroyed.
        if (receiver != null) {
            this.unregisterReceiver(receiver);
        }
    }
    // Refreshes the display if the network connection and the
    // pref settings allow it.


    // Checks the network connection and sets the wifiConnected and mobileConnected
    // variables accordingly.
    @Override
    public void onStart () {
        super.onStart();

        // Gets the user's network preference settings
        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);

        // Retrieves a string value for the preferences. The second parameter
        // is the default value to use if a preference value is not found.
        sPref = sharedPrefs.getString("listPref", "Wi-Fi");

        updateConnectedFlags();

        if(refreshDisplay){
            loadPage();
        }
    }
    public void updateConnectedFlags() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
        if (activeInfo != null && activeInfo.isConnected()) {
            wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
            mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
        } else {
            wifiConnected = false;
            mobileConnected = false;
        }
    }
    public void loadPage() {
        if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected))
                || ((sPref.equals(WIFI)) && (wifiConnected))) {
            webView.loadUrl(URL);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setWebViewClient(new WebViewClient());
            refreshDisplay=true;

        } else {
            errorDialog();
        }
    }

    public void errorDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder
                .setMessage("No internet connection on your device. Would you like to enable it?")
                .setTitle("No Internet Connection")
                .setCancelable(false)
                .setPositiveButton("Enable Internet",
                        new DialogInterface.OnClickListener()
                        {
                            public void onClick(DialogInterface dialog, int id)
                            {
                                Intent dialogIntent = new Intent(android.provider.Settings.ACTION_SETTINGS);
                                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                getApplicationContext().startActivity(dialogIntent);
                            }
                        });
        builder.setNegativeButton(" Cancel ", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
                dialog.cancel();
            }
        });

        AlertDialog alert = builder.create();
        alert.show();
    }

}

我的NetworkReceiver类

    public class NetworkReceiver extends BroadcastReceiver {

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

        // Checks the user prefs and the network connection. Based on the result, decides whether
        // to refresh the display or keep the current display.
        // If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection.
        if (WIFI.equals(sPref) && 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;

            // 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 (ANY.equals(sPref) && networkInfo != null) {
            JobPage.refreshDisplay = true;

            // 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 {
            JobPage.refreshDisplay = false;
            Toast.makeText(context, "Lost internet connection", Toast.LENGTH_SHORT).show();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您需要添加BroadcastReceiver来处理CONNECTIVITY_CHANGE。这将允许您的应用在网络状态发生变化时得到通知,例如无法连接互联网。

public class NetworkChangeReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(final Context context, final Intent intent) {
       boolean isOnline = isOnline( context );
       // Fire an event with the new status of the network.
       Bus bus = new Bus(ThreadEnforcer.MAIN);
       bus.post( new NetworkEvent( isOnline ) );
   }

    public boolean isOnline(Context context) {
         ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo netInfo = cm.getActiveNetworkInfo();
         //should check null because in airplane mode it will be null
         return (netInfo != null && netInfo.isConnected());
     }
}

在你的清单中,你还需要添加那个接收器。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <receiver
    android:name="NetworkChangeReceiver"
    android:label="NetworkChangeReceiver" >
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

现在,为了实际发送数据,我将使用事件总线库Otto

创建一个类来包含我们将要放在事件总线上的信息。

public class NetworkEvent {

    private boolean isOnline;

    public NetworkEvent( boolean isOnline ) {
        this.isOnline = isOnline;
    }
}

最后在你的JobPage活动中,注册(并在onDestroy上注销)总线,你可以Subscribe参加活动。

public class JobPage extends AppCompatActivity {
    @Override
    protected void onCreated( Bundle savedInstanceState ) {
        ...
        Bus bus = new Bus(ThreadEnforcer.MAIN);
        bus.register(this);
        ...
    }


    ...
    @Subscribe
    public void onNetworkChange( NetworkEvent event ) {
         if( event.isOnline ) {
            // Do refresh.
         }
    }
}

答案 1 :(得分:0)

通过使用线程处理程序,您可以在每5秒钟后运行Web视图,请检查以下代码。

  public class JobPage extends AppCompatActivity {

    private WebView webView;

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

        if(isNetworkStatusAvialable (getApplicationContext())) {
            Toast.makeText(getApplicationContext(), "internet available", Toast.LENGTH_SHORT).show();
            webView=(WebView)findViewById(R.id.webView);
            webView.loadUrl("https:...webaddress");
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setWebViewClient(new WebViewClient());

            CallWebView();
        } else {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder
                    .setMessage("No internet connection on your device. Would you like to enable it?")
                    .setTitle("No Internet Connection")
                    .setCancelable(false)
                    .setPositiveButton("Enable Internet",
                            new DialogInterface.OnClickListener()
                            {
                                public void onClick(DialogInterface dialog, int id)
                                {
                                    Intent dialogIntent = new Intent(android.provider.Settings.ACTION_SETTINGS);
                                    dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    getApplicationContext().startActivity(dialogIntent);
                                }
                            });
            builder.setNegativeButton(" Cancel ", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int id)
                {
                    dialog.cancel();
                }
            });

            AlertDialog alert = builder.create();
            alert.show();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

    }

    public static boolean isNetworkStatusAvialable (Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null)
        {
            NetworkInfo netInfos = connectivityManager.getActiveNetworkInfo();
            if(netInfos != null)
                if(netInfos.isConnected())
                    return true;
        }
        return false;
    }

    public void CallWebView() {
        final Handler ha=new Handler();
        ha.postDelayed(new Runnable() {

            @Override
            public void run() {
                //call function
                webView.loadUrl("http://www.google.com");
                ha.postDelayed(this, 1000);
            }
        }, 1000);
    }
}

答案 2 :(得分:-1)

以下代码将在每1秒后调用一次方法,以便您的webview在每1秒钟后自动刷新

 public void CallWebView() {
        final Handler ha=new Handler();
        ha.postDelayed(new Runnable() {

            @Override
            public void run() {
                //call function
                 webView.loadUrl("http://www.google.com");
                ha.postDelayed(this, 1000);
            }
        }, 1000);
    }