Вызовите javascript в Webview по триггеру из другого класса в java (android studio) - PullRequest
0 голосов
/ 04 мая 2020

У меня есть WebView в моем файле MainActivity, и я получаю уведомления pu sh в моем файле MyFirebaseMessagingService. Моя цель - обновлять мое локальное хранилище WebView всякий раз, когда я получаю новое уведомление.

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(final RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        SharedPreferences settings = getApplicationContext().getSharedPreferences("mySettings", 0);
        SharedPreferences.Editor editor = settings.edit();
        final String myNewMessage = remoteMessage.getData().toString();
        editor.putString("NEW_MESSAGE", myNewMessage);
        editor.apply();

        Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                MainActivity myMain = new MainActivity();
                myMain.updateLocalStorage(myNewMessage);
            }
        }, 1000 );
    }
}
public class MainActivity extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished (WebView view, String url){
                SharedPreferences settings = getApplicationContext().getSharedPreferences("mySettings", 0);
                SharedPreferences.Editor editor = settings.edit();
                String keyToken = "NEW_MESSAGE";
                String myNewToken = settings.getString("NEW_TOKEN", "0");
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                    webView.evaluateJavascript("localStorage.setItem('"+ keyToken +"','"+ myNewToken +"');", null);
                } else {
                    webView.loadUrl("javascript:localStorage.setItem('"+ keyToken +"','"+ myNewToken +"');");
                }
            }
        });

        webView.setWebChromeClient(new WebChromeClient() );
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webView.loadUrl("https://myreactjsapp.com/");
    }

    public void updateLocalStorage(String myNewMessage){
        String keyToken = "NEW_MESSAGE";
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            webView.evaluateJavascript("localStorage.setItem('"+ keyToken +"','"+ myNewMessage +"');", null);
        } else {
            webView.loadUrl("javascript:localStorage.setItem('"+ keyToken +"','"+ myNewMessage +"');");
        }
    }
}

Используя приведенный выше код, я могу обновить локальное хранилище onPageFinished, считав значение из общих настроек. Но когда я пытаюсь обновить значение с помощью функции updateLocalStorage, вызванной onMessageReceived, я получаю сообщение об ошибке:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.webkit.WebView.evaluateJavascript(java.lang.String, android.webkit.ValueCallback)' on a null object reference

Кто-нибудь знает, что мне нужно сделать, чтобы иметь возможность запустить функцию updateLocalStorage из onMessageReceived без получение исключения NullPointerException?

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...