2015-07-28 7 views
0

Я пытаюсь использовать shouldInterceptRequest, чтобы закрыть мой веб-просмотр, когда я хочу загрузить определенный URL-адрес, но приложение вылетает, когда я это делаю.Android-приложение падает на shouldInterceptRequest

Для проверки URL-адреса против того, что происходит из Интернета, я использую метод webview.getURL(). Я использую этот метод в потоке пользовательского интерфейса, чтобы получить URL-адрес.

Пожалуйста, найти свой код ниже

public WebResourceResponse shouldInterceptRequest(final WebView view, String url) { 

     WebActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       CloseURL = webView.getUrl(); 

      } 
     }); 

     if (CloseURL.contains("dummyurl") &&BackPressed) { 
      BackPressed=false; 
      CloseURL=""; 

      WebActivity.this.finish(); 

     } 
     return super.shouldInterceptRequest(view, url); 

    } 
+0

и StackTrace это? –

+0

Во-вторых, почему используется uithread здесь. Я думаю, что это уже в uithread. – hariszaman

+0

В stacktrace я получаю предупреждение: 07-28 19: 34: 05.450: W/webview_proxy (13113): java.lang.Throwable: Warning: метод WebView был вызван в потоке 'WebViewCoreThread'. Все методы WebView должны быть вызваны в потоке пользовательского интерфейса. Будущие версии WebView могут не поддерживать использование других потоков. – VaV

ответ

1

Когда вы сделаете это,

WebActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      CloseURL = webView.getUrl(); 

     } 
    }); 

это очереди, код для запуска позже. Затем вы продолжаете использовать CloseUrl сразу после этого. Если вы ожидаете CloseUrl быть назначены при использовании его здесь,

if (CloseURL.contains("dummyurl") &&BackPressed) { 

вы не правы, это не было еще назначены. Код, который его назначает, еще не запущен.

Вы должны переместить код, который зависит от CloseUrl, в ваш Runnable.run().

общественного WebResourceResponse shouldInterceptRequest (окончательный вид WebView, String URL) {

WebActivity.this.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      CloseURL = webView.getUrl(); 
      if (CloseURL.contains("dummyurl") &&BackPressed) { 
       BackPressed=false; 
       CloseURL=""; 

       WebActivity.this.finish(); 

      } 
     } 
    }); 

    return super.shouldInterceptRequest(view, url); 
} 
+0

Привет, Джеффри, спасибо за информацию. В настоящее время я использую Android 4.3, и приложение здесь сбой. это происходит потому, что geturl() работает в потоке и коде UI внутри shouldInterceptRequest() работает в другом потоке. В android 4.3 нам не разрешено вызывать методы веб-просмотра, такие как geturl(), в другом потоке, поэтому приложение аварийно завершает работу. Пожалуйста, дайте мне знать, если у нас есть обходные пути для этого. – VaV

+0

Как я уже упоминал, переместите код, который использует CloseURL в метод 'run()'. См. Обновление. –

Смежные вопросы