Vấn đề với Check Internet trên Webview
Chào mọi người, mình đang thiết kế webview nhưng mình lại không hiểu về code. Mình đã làm theo hướng dẫn trên youtube về các phần nhỏ như splash screen, progressBar,..nhưng đến phần check internet mình làm theo rất nhiều cách nhưng không thể hoạt động được. Mình đã làm layout khi không có kết nối Internet và nút bấm nhưng khi tắt wifi và chạy layout vẫn chưa lên được. Mình đã code theo rất nhiều cách trên mạng nhưng vẫn không thể hoạt động và không hiểu vấn đề ở đâu. Mọi người giúp mình có hướng dẫn cụ thể chi tiết với!
1 CÂU TRẢ LỜI
@cuaong222 Đọc qua câu hỏi thì bạn đang code App, nhưng bạn chưa chỉ rõ đang code Android, iOS, React Native hay..... Nhưng dù code bằng cái gì thì dùng js hay là native code thì phải call network service và lắng nghe -> khi nó thay đổi thì update vào một cái biến state nào đó. dùng cái biến đó thay đổi giao diện cho phù hợp với UI/UX bạn mong muốn
Cảm ơn bạn, mình code app Android. Hôm qua mình đã làm được rồi, nhưng còn một phần nhỏ. Lúc mình tắt mạng đi load lại webview thì đã hiện giao diện No Internet mình đã thiết kế. Nhưng khi bật mạng và reload lại, trong lúc chuẩn bị load lại màn hình chính thì trong 1, 2 giây load đấy nó vẫn hiện màn hình mặc đình Err.internet.disconected của Android.
@cuaong222 mình đoán thôi có thể state là true/false nên dễ bị như thế. ví khi get đc network info or lắng nghe nó thì mất khoảng time. bạn hay làm state dạng string hay enum xem sao
loading
: trạng tái ban đầu chưa biết có mạng hay chưaconnected
: đã có mạngdisconnected
: mất mạng Như logic trên ban đầu init của bạn có thể đang làdisconnected
. H dùng 3 trạng thai này đủ cover
Mình gửi main activity bạn xem giúp mình nhé. Đường link trong webview mình trỏ sang Chrome ạ package standing.wap.alocredit;
import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.ProgressBar; import android.widget.RelativeLayout;
import androidx.appcompat.app.AppCompatActivity; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
public class MainActivity extends AppCompatActivity {
private WebView web;
String webUrl = "https://dautunghiduong.com.vn/";
private ProgressBar progressBar;
private SwipeRefreshLayout swipeRefreshLayout;
RelativeLayout relativeLayout;
Button NointernetBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
web = (WebView) findViewById(R.id.myweb);
web.loadUrl(webUrl);
WebSettings mywebsettings = web.getSettings();
mywebsettings.setJavaScriptEnabled(true);
web.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) {
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
} else {
return false;
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
internetcheck();
super.onReceivedError(view, request, error);
}
});
//improve webview perfomance
web.getSettings().setAllowFileAccess(true);
web.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
web.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
web.getSettings().setAppCacheEnabled(true);
web.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mywebsettings.setDomStorageEnabled(true);
mywebsettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
mywebsettings.setUseWideViewPort(true);
mywebsettings.setSavePassword(true);
mywebsettings.setSaveFormData(true);
mywebsettings.setEnableSmoothTransition(true);
//progress bar
progressBar = (ProgressBar) findViewById(R.id.progressBar);
web.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
progressBar.setProgress(progress);
if (progress < 100 && progressBar.getVisibility() == ProgressBar.GONE) {
progressBar.setVisibility(ProgressBar.VISIBLE);
}
if (progress == 100) {
progressBar.setVisibility(ProgressBar.GONE);
}
}
});
//pull to refresh
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
swipeRefreshLayout.setRefreshing(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
web.reload();
}
}, 1500);
}
});
swipeRefreshLayout.setColorSchemeColors(
getResources().getColor(android.R.color.holo_blue_dark),
getResources().getColor(android.R.color.holo_orange_dark),
getResources().getColor(android.R.color.holo_green_dark),
getResources().getColor(android.R.color.holo_red_dark)
);
//internet connection
NointernetBtn = (Button) findViewById(R.id.btnRetry);
relativeLayout = (RelativeLayout) findViewById(R.id.nointernet);
internetcheck();
NointernetBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
internetcheck();
}
});
}
@Override
public void onBackPressed() {
if (web.canGoBack()) {
web.goBack();
} else {
super.onBackPressed();
}
}
public void internetcheck(){
ConnectivityManager connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobiledata = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mobiledata.isConnected()){
web.setVisibility(View.VISIBLE);
swipeRefreshLayout.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
web.reload();
}
else if(wifi.isConnected()){
web.setVisibility(View.VISIBLE);
swipeRefreshLayout.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
web.reload();
}
else{
web.setVisibility(View.GONE);
swipeRefreshLayout.setVisibility(View.GONE);
relativeLayout.setVisibility(View.VISIBLE);
}
}
}
@cuaong222 Mình thấy cái này trên stackoverflow bạn thử xem https://stackoverflow.com/questions/6392318/detecting-webview-error-and-show-message
Cái này check khi vừa vào activity
webView.loadUrl(urlToLoad);
if (!isConnected(getActivity())) {
Toast.makeText(getActivity(), "You are offline ", Toast.LENGTH_SHORT).show();
}
.....
public static boolean isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != cm) {
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
return false;
}
Đoạn này check trong webview:
/*
* Added in API level 23 replacing :-
*
* onReceivedError(WebView view, int errorCode, String description, String failingUrl)
*/
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
Toast.makeText(getActivity(),
"WebView Error" + error.getDescription(),
Toast.LENGTH_SHORT).show();
super.onReceivedError(view, request, error);
}
/*
Added in API level 23
*/
@Override
public void onReceivedHttpError(WebView view,
WebResourceRequest request, WebResourceResponse errorResponse) {
Toast.makeText(getActivity(),
"WebView Error" + errorResponse.getReasonPhrase(),
Toast.LENGTH_SHORT).show();
super.onReceivedHttpError(view, request, errorResponse);
}