2015-09-08 2 views
3

Я использую WebView с javascript интерфейс, а иногда, когда я звоню loadUrl на webView, mWebView.getContext()null.View.getContext возвращает null, почему?

  1. Как у вида нет контекста? Зачем ?
  2. Является ли контекст whitout, который все еще используется или может использоваться повторно?
  3. Что делать, если у моего представления нет контекста?
  4. Важнейшее значение, если представление не имеет контекста, будет выполнено mWebView.post(new Runnable() { ...?
  5. Подходит ли этот код?

    if (Looper.getMainLooper().getThread() == Thread.currentThread()) { 
        mWebView.loadUrl("javascript:..."); 
    } else { 
        mWebView.post(new Runnable() { 
         public void run() { 
          mWebView.loadUrl("javascript:..."); 
         } 
        }); 
    } 
    
+2

, если это происходит, в основном потому, что Activity/Fragment, на котором размещен виджет, отключен – Blackbelt

ответ

10

2 общие причины нулевого контекста в целях:

  • Вы пытаетесь получить контекст обратного вызова асинхронного (обработчик, сетевой вызов) вызов, но активность/фрагмент исчез из-за другого действия пользователя (например: нажата назад). Поэтому представление отделяется и больше не имеет контекста.

  • У вас есть утечка памяти где-то и два или более экземпляра вашей деятельности и иерархия представлений. Тогда что-то происходит в том экземпляре, о котором вы больше не ссылаетесь, но представление потеряло ссылку на его контекст.

Относительно обработчика. Я не уверен, что у представления есть свой собственный обработчик, или если он использует обработчик Activity, к которому он привязан, вам, вероятно, придется прочитать источник, чтобы узнать. Однако вопрос не имеет особого значения: если представление не имеет контекста, у вас есть большая проблема: его нет на экране.

Относительно того, является ли код в 5. релевантным, вам нужно будет ответить на следующие вопросы: почему бы вам не знать, в каком потоке работает ваш код?

Когда вы знаете, в каком потоке вы находитесь, и если имеет смысл, чтобы вы не были в основном потоке, то использование обработчика является допустимым способом выполнения вашего кода на главном. Также как Activity.runOnUiThread()

Просто помните, что жизненный цикл обработчика не привязан к действию. Таким образом, вы должны очистить очередь сообщений и runnables, когда ваша активность/фрагмент приостанавливается

+0

спасибо за ваш ответ, можете проверить вопрос 4 и 5? –

+0

Что делать, если я хотел бы что-то сделать в веб-просмотре, но mWebView.getContext() 'return null, то фрагмент возобновляется и действие не запускается, вызывая странное состояние на странице –

+0

, если у вашего представления нет контекста, тогда по какой-то причине это не на экране. Это то, что «по какой-то причине» вам нужно искать, и веб-просмотр будет работать отлично – znat

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