Yêu cầu thg 9 3, 2022 5:22 SA 140 0 1
  • 140 0 1
0

Vấn đề với Check Internet trên Webview

Chia sẻ
  • 140 0 1

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


Đã trả lời thg 9 5, 2022 1:51 SA
Đã được chấp nhận
+1

@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

Chia sẻ
Avatar Trung @cuaong222
thg 9 5, 2022 2:47 SA

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.

thg 9 5, 2022 3:37 SA

@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ưa
  • connected: đã có mạng
  • disconnected: 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
Avatar Trung @cuaong222
thg 9 5, 2022 4:36 SA

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

}

thg 9 7, 2022 2:05 SA

@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);
    }
Avatar Trung @cuaong222
thg 9 7, 2022 3:01 SA

@haipq Cảm ơn bạn nhiều!

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí