Android的 - 显示一条消息,如果没有互联网连接,并继续检查 [英] Android - Show a message if no internet connection and continue to check

查看:250
本文介绍了Android的 - 显示一条消息,如果没有互联网连接,并继续检查的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直工作在这几天的了。我刚开始与Android合作。我有一个2部分的问题。我想检查网络连接。如果是推出web视图如果不给加载警报和prevent web视图。我曾经试过,但如果没有互联网连接(例如,飞行模式),它的力量关闭。我如何得到它发出的信息并停止加载web视图。也就是有没有办法连接连续检查,这样,当它失去连接不显示网页404?

下面是我的code。

 公共类MainActivity延伸活动{    私人的WebView web视图;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        ConnectivityManager厘米=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        android.net.NetworkInfo无线=厘米
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        android.net.NetworkInfo DATAC =厘米
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        如果((WIFI = NULL&安培;!DATAC = NULL)
                &功放;&安培; (wifi.isConnected()| datac.isConnected())){
            的setContentView(R.layout.activity_main);
                 }其他{
                //无连接
                  吐司面包= Toast.makeText(MainActivity.this,没有网络连接,Toast.LENGTH_LONG);
                  toast.show();
        }        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(真);        web视图=(的WebView)findViewById(R.id.webview);
        webView.setWebViewClient(新MyWebViewClient());
        webView.getSettings()setJavaScriptEnabled(真)。
        webView.loadUrl(http://mysite.com/?ma=1);
    }
        私有类MyWebViewClient扩展WebViewClient {
            @覆盖
            公共布尔shouldOverrideUrlLoading(的WebView视图,字符串URL){
                如果(Uri.parse(URL).getHost()。等于(mysite.com)){
                    返回false;
                }
                //否则,该链接不上我的网站页面,因此启动该处理URL另一活动
                意向意图=新意图(Intent.ACTION_VIEW,Uri.parse(URL));
                startActivity(意向);
                返回true;
            }
        }
    @覆盖
    公共布尔的onkeydown(INT键code,KeyEvent的事件){
        //检查关键事件是后退按钮,如果有历史
        如果((键code == KeyEvent.KEY code_BACK)及和放大器; webView.canGoBack()){
            webView.goBack();
            返回true;
        }
        //如果不是返回键或没有网页的历史,泡到默认
        //系统行为(可能退出该活动)
        返回super.onKeyDown(键code,事件);
    }    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        //充气菜单;如果是present这增加了项目操作栏。
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }    @覆盖
    公共布尔onOptionsItemSelected(菜单项项)
    {
        开关(item.getItemId())
        {
            案例R.id.logout:
                完();
                返回true;
        }
      返回false;
    }
}

编辑:添加错误
具体而言,我得到这些错误时,pressing后回显示敬酒说没有互联网连接。它崩溃,如果我使用后退按钮敬酒消息后,并且错误是下面。

  04-07 14:40:​​38.664:E / AndroidRuntime(15173):致命异常:主要
04-07 14:40:​​38.664:E / AndroidRuntime(15173):显示java.lang.NullPointerException
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在com.mysite.testapp.MainActivity.onKeyDown(MainActivity.java:67)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.view.KeyEvent.dispatch(KeyEvent.java:2705)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.app.Activity.dispatchKeyEvent(Activity.java:2401)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent(PhoneWindow.java:2007)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3813)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3761)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.view.ViewRootImpl $ ViewRootHandler.handleMessage(ViewRootImpl.java:2926)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.os.Handler.dispatchMessage(Handler.java:99)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.os.Looper.loop(Looper.java:137)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在android.app.ActivityThread.main(ActivityThread.java:4918)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在java.lang.reflect.Method.invokeNative(本机方法)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在java.lang.reflect.Method.invoke(Method.java:511)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-07 14:40:​​38.664:E / AndroidRuntime(15173):在dalvik.system.NativeStart.main(本机方法)


解决方案

要检查网络连接可用性使用下面的

 公共类CheckNetwork {
私有静态最后弦乐TAG = CheckNetwork.class.getSimpleName();公共静态布尔isInternetAvailable(上下文的背景下)
{
    的NetworkInfo信息=(的NetworkInfo)((ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE))getActiveNetworkInfo()。    如果(资讯== NULL)
    {
         Log.d(TAG,没有互联网连接);
         返回false;
    }
    其他
    {
        如果(info.isConnected())
        {
            Log.d(TAG,可互联网连接......);
            返回true;
        }
        其他
        {
            Log.d(TAG,互联网连接);
            返回true;
        }    }
}
    }

在你的活动

 如果(CheckNetwork.isInternetAvailable(Activity.this))如果网络可用//返回true
                {                        //做一点事。 loadwebview。
                }
               其他
                {
                    Toast.makeText(Activity.this,没有网络连接,1000).show();
                }

在后退按钮preSS

  @覆盖
公共布尔的onkeydown(INT键code,KeyEvent的事件){
    如果(event.getAction()== KeyEvent.ACTION_DOWN){
        开关(键code)
        {
        案例KeyEvent.KEY code_BACK:
            如果(mWebView.canGoBack()==真){
                mWebView.goBack();
            }其他{
                完();
            }
            返回true;
        }    }
    返回super.onKeyDown(键code,事件);
   }

更新:如果您需要在任何时候,系统会广播事件来检查网络连接的可用性当有连接改变或连接丢失。您可以通过在广播注册捕捉您的活动的广播。但是,你需要不需要时注销。

一个例子是在下面的链接。

<一个href=\"http://stackoverflow.com/questions/3141807/android-service-to-check-internet-connectivity\">Android服务检查互联网连接?。

或者你可以用在后台检查互联网连接服务。但是,你需要不需要时摧毁的服务。但服务是用于运行长期运行在后台操作

更新2:

尝试下面。我已经测试。它适用于我的三星Galaxy S3。

在清单中添加这些权限

 &LT;使用许可权的android:NAME =android.permission.INTERNET对/&GT;
        &LT;使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/&GT;
        &LT;使用许可权的android:NAME =android.permission.ACCESS_WIFI_STATE/&GT;

您activity_main.xml中

 &LT;的RelativeLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
 的xmlns:工具=htt​​p://schemas.android.com/tool​​s
 机器人:layout_width =match_parent
 机器人:layout_height =match_parent
 工具:上下文=MainActivity。&GT; &LT;的WebView
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =FILL_PARENT
    机器人:layout_centerHorizo​​ntal =真
    机器人:layout_centerVertical =真
    机器人:ID =@ + ID / WV/&GT;&LT; / RelativeLayout的&GT;

您活动

 公共类MainActivity延伸活动{ 私人的WebView web视图;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        web视图=(的WebView)findViewById(R.id.wv);
        如果(CheckNetwork.isInternetAvailable(MainActivity.this))
        {
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(真);      // web视图=(的WebView)findViewById(R.id.wv);
       // webView.setWebViewClient(新MyWebViewClient());
        webView.getSettings()setJavaScriptEnabled(真)。
        webView.setWebChromeClient(新WebChromeClient(){
               公共无效onProgressChanged(的WebView观点,诠释进度){
                 //活动和不同规模的网页视图衡量进展情况。
                 //当我们达到100%的进度条会自动消失
                MainActivity.this.setProgress(进度* 1000);
               }
             });
             webView.setWebViewClient(新WebViewClient(){
               公共无效onReceivedError(的WebView观点,诠释错误code,描述字符串,字符串failingUrl){
                 Toast.makeText(MainActivity.this,哦,不!+描述,Toast.LENGTH_SHORT).show();
               }
             });             webView.loadUrl(http://slashdot.org/);
             }
     其他{
            //无连接
              吐司面包= Toast.makeText(MainActivity.this,没有网络连接,Toast.LENGTH_LONG);
              toast.show();
    }
}@覆盖
公共布尔的onkeydown(INT键code,KeyEvent的事件){
    如果((键code == KeyEvent.KEY code_BACK)及和放大器; webView.canGoBack()){
        webView.goBack();
        返回true;
    }
    其他
    {
        完();
    }
    返回super.onKeyDown(键code,事件);
}
}

I've been working on this for a couple of days now. I just started working with Android. I have a 2 part question. i want to check if internet is available. If it is launch the webView if not give an alert and prevent webView from loading. I have tried this but it force closes if there is not internet connection(e.g. airplane mode). How do I get it to give a message and stop loading the webview. Also is there a way to continuously check for connection so that the webpage 404 is not shown when it loses connection?

Here is my code.

    public class MainActivity extends Activity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        android.net.NetworkInfo wifi = cm
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        android.net.NetworkInfo datac = cm
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if ((wifi != null & datac != null)
                && (wifi.isConnected() | datac.isConnected())) {
            setContentView(R.layout.activity_main);
                 }else{
                //no connection
                  Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection", Toast.LENGTH_LONG);
                  toast.show();  
        }

        CookieManager cookieManager = CookieManager.getInstance(); 
        cookieManager.setAcceptCookie(true); 

        webView = (WebView) findViewById(R.id.webview);
        webView.setWebViewClient(new MyWebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("http://mysite.com/?ma=1");
    }   
        private class MyWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (Uri.parse(url).getHost().equals("mysite.com")) {
                    return false;
                }
                // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);
                return true;
            }
        }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Check if the key event was the Back button and if there's history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        // If it wasn't the Back key or there's no web page history, bubble up to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        switch (item.getItemId()) 
        {
            case R.id.logout:
                finish();
                return true;
        }
      return false;
    }


}

Edit: Added Errors To be specific, I get these errors when pressing back after it shows the Toast saying there is no internet connect. It crashes if I use the back button after the toast message and the errors are below.

04-07 14:40:38.664: E/AndroidRuntime(15173): FATAL EXCEPTION: main
04-07 14:40:38.664: E/AndroidRuntime(15173): java.lang.NullPointerException
04-07 14:40:38.664: E/AndroidRuntime(15173):    at com.mysite.testapp.MainActivity.onKeyDown(MainActivity.java:67)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.view.KeyEvent.dispatch(KeyEvent.java:2705)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.app.Activity.dispatchKeyEvent(Activity.java:2401)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2007)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3813)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3761)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2926)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.os.Looper.loop(Looper.java:137)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at android.app.ActivityThread.main(ActivityThread.java:4918)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at java.lang.reflect.Method.invokeNative(Native Method)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at java.lang.reflect.Method.invoke(Method.java:511)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-07 14:40:38.664: E/AndroidRuntime(15173):    at dalvik.system.NativeStart.main(Native Method)

解决方案

To check Network connection availability use the below

    public class CheckNetwork {


private static final String TAG = CheckNetwork.class.getSimpleName();



public static boolean isInternetAvailable(Context context)
{
    NetworkInfo info = (NetworkInfo) ((ConnectivityManager)
    context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

    if (info == null)
    {
         Log.d(TAG,"no internet connection");
         return false;
    }
    else
    {
        if(info.isConnected())
        {
            Log.d(TAG," internet connection available...");
            return true;
        }
        else
        {
            Log.d(TAG," internet connection");
            return true;
        }

    }
}
    }

In your Activity

              if(CheckNetwork.isInternetAvailable(Activity.this)) //returns true if internet available
                {

                        //do something. loadwebview.
                }   
               else
                {
                    Toast.makeText(Activity.this,"No Internet Connection",1000).show();
                }  

On back button press

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            if(mWebView.canGoBack() == true){
                mWebView.goBack();
            }else{
                finish();
            }
            return true;
        }

    }
    return super.onKeyDown(keyCode, event);
   }

Update : if you need to check network connection availability at all times, System broadcasts events when there is connectivity change or loss of connectivity. You can capture those broadcasts in your activity by registering for the broadcast. But you need to unregister when not required.

An example is at the below Link.

Android service to check internet connectivity?.

Or you can use a service that checks internet connectivity in the background. But you need to destroy the service when not required. But service is used for running long running operations in background

Update 2:

Try the below. I have tested. It works on my Samsung Galaxy S3.

Add these permissions in manifest

        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Your activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity" >

 <WebView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:id="@+id/wv"/>

</RelativeLayout>

Your activity

 public class MainActivity extends Activity {

 private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.wv);
        if(CheckNetwork.isInternetAvailable(MainActivity.this))
        {
        CookieManager cookieManager = CookieManager.getInstance(); 
        cookieManager.setAcceptCookie(true); 

      // webView = (WebView) findViewById(R.id.wv);
       // webView.setWebViewClient(new MyWebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient() {
               public void onProgressChanged(WebView view, int progress) {
                 // Activities and WebViews measure progress with different scales.
                 // The progress meter will automatically disappear when we reach 100%
                MainActivity.this.setProgress(progress * 1000);
               }
             });
             webView.setWebViewClient(new WebViewClient() {
               public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                 Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
               }
             });

             webView.loadUrl("http://slashdot.org/");
             }
     else{
            //no connection
              Toast toast = Toast.makeText(MainActivity.this, "No Internet Connection", Toast.LENGTH_LONG);
              toast.show();  
    }


}   



@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
        webView.goBack();
        return true;
    }
    else
    {
        finish();
    }
    return super.onKeyDown(keyCode, event);
}
}

这篇关于Android的 - 显示一条消息,如果没有互联网连接,并继续检查的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆