Загрузка кеша в автономном режиме в Android Webview - PullRequest
1 голос
/ 22 ноября 2011

Я нашел код, который должен проверять, находится ли приложение в автономном режиме и должно загружать кеш, или в режиме онлайн, и должно загружать URL. Вот код, который я использовал для этого:

ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
String weblink = "http://www.google.com";
if(cm.getActiveNetworkInfo().isConnected()){
    myWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    myWebView.loadUrl(weblink);
} else {
    myWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    myWebView.loadUrl(weblink);
}

А это мои разрешения:

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

Моя проблема: когда я в самолете или мои соединения отключены. Приложение приложение закрывается. Когда я в сети, приложение просто загружается и работает нормально ... Что я не так сделал?

Это мой logcat:

11-22 10:09:40.310: E/AndroidRuntime(323): FATAL EXCEPTION: main
11-22 10:09:40.310: E/AndroidRuntime(323): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.martijngijselaar.rooster/com.martijngijselaar.rooster.SaxionRoosterActivity}: java.lang.NullPointerException
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.os.Looper.loop(Looper.java:123)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread.main(ActivityThread.java:4627)
11-22 10:09:40.310: E/AndroidRuntime(323):  at java.lang.reflect.Method.invokeNative(Native Method)
11-22 10:09:40.310: E/AndroidRuntime(323):  at java.lang.reflect.Method.invoke(Method.java:521)
11-22 10:09:40.310: E/AndroidRuntime(323):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-22 10:09:40.310: E/AndroidRuntime(323):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-22 10:09:40.310: E/AndroidRuntime(323):  at dalvik.system.NativeStart.main(Native Method)
11-22 10:09:40.310: E/AndroidRuntime(323): Caused by: java.lang.NullPointerException
11-22 10:09:40.310: E/AndroidRuntime(323):  at com.martijngijselaar.rooster.SaxionRoosterActivity.onCreate(SaxionRoosterActivity.java:34)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-22 10:09:40.310: E/AndroidRuntime(323):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-22 10:09:40.310: E/AndroidRuntime(323):  ... 11 more

Хорошо, чтобы было проще, вот весь код:

package com.martijngijselaar.rooster;

import android.app.Activity;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class SaxionRoosterActivity extends Activity {
    private static final int MENU1 = Menu.FIRST;
    private static final int MENU2 = Menu.FIRST + 1;
    private static final int MENU3 = Menu.FIRST + 2;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.main);
        WebView myWebView = (WebView) findViewById(R.id.webview);
        myWebView.setWebViewClient(new WebViewClient());

        // Checken of er een connectie is, zo niet dan de chache laden, zo wel dan gewoon het netwerk laden!!
        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
        String weblink = "http://google.com/";
        if(cm.getActiveNetworkInfo().isConnected()){
            myWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
            myWebView.loadUrl(weblink);
        } else {
            myWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            myWebView.loadUrl(weblink);
        }

        // Zorgen dat je input kunt gebruiken in de webview
        myWebView.requestFocus(View.FOCUS_DOWN);
        myWebView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_UP:
                        if (!v.hasFocus()) {
                            v.requestFocus();
                        }
                        break;
                }
                return false;
            }

        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, MENU1, 0, "Wijzig klas");
        menu.add(0, MENU2, 0, "Disclaimer");
        menu.add(0, MENU3, 0, "Sluiten");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        WebView myWebView = (WebView) findViewById(R.id.webview);
        switch (item.getItemId()) {
        case MENU1:
            myWebView.loadUrl("http://google.nl");
            return true;
        case MENU2:
            myWebView.loadUrl("http://google.nl");
            return true;
        case MENU3:
            finish();
            return true;
        }
        return false;
    }
}

1 Ответ

0 голосов
/ 25 ноября 2011

Ваш чек на соединение должен быть настроен. Хотя есть свойство isConnected, сначала нужно проверить, возвращает ли getActiveNetworkInfo () значение NULL. Если он возвращает ноль, информация об активной сети отсутствует - это то, что вы получите в режиме полета. Это проверка, которую я использую для подключения к сети

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}
...