在我的应用程序中,我实现了一个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();
}
}
}
答案 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);
}