2015-04-16 3 views
0

В моем приложении мне нужно использовать определенный вид (WebView) для использования кода javascript в фоновом режиме. Это означает, что веб-просмотр должен быть вне экрана. Первоначально я создал это представление внутри потока пользовательского интерфейса, используя runOnUiThread, но я заметил, что когда я делаю некоторую операцию в пользовательском интерфейсе (коснитесь экрана для перемещения какого-либо объекта), мой фоновый вид, похоже, замедляется и не является «resposnive» по мере необходимости. Отсюда идея «выполнить» это представление во вторичном потоке, чтобы сделать его независимым. Я не знаю, возможно ли это в любом случае. Я начал делать этот код:Android: создание и управление представлением внутри вторичного потока

class WebViewThread extends Thread 
{ 
    public WebView MyWebView = null; 

    public void run() 
    { 
     Looper.prepare(); 

     MyWebView = new WebView(MainActivityContext); 

     Looper.loop(); 
    } 
} 

Проблема заключается в том, если я пытаюсь «взаимодействовать» с точкой зрения вызывающего некоторый методом из UI нити я получил сообщение об ошибке во время выполнения, говоря мне, что взгляд может сострадать только одной и ту же тему которые его создают. К сожалению, этот поток «заперт» в цикле, и я понятия не имею, как «вводить» взаимодействующий код внутри этого потока.

Теперь вопрос: моя идея создания и управления представлением внутри вторичного потока может быть выполнена или это действительно плохая идея, которая не может работать?

ответ

0

Что касается хорошей идеи, то кто-то более опытный должен будет подробно остановиться на этом вопросе. Однако для того, что вы пытаетесь сделать, предполагая, что вы не касаетесь элементов пользовательского интерфейса, вы можете попробовать обработчик для передачи кода в ваш веб-просмотр. Смотрите, если это работает:

Handler handler; 

class WebViewThread extends Thread 
{ 
    public WebView MyWebView = null; 

    public void run() 
    { 
     Looper.prepare(); 
     MyWebView = new WebView(MainActivityContext); 

     //the handler will run on the thread 
     handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 

       //do stuff to my webview 
      } 
     }; 

     Looper.loop(); 
    } 
} 

, а затем вы можете сделать обработчик делать вещи с

handler.sendMessage(message); 
+0

Привет, это может быть решение, но как получить данные обратно? – Suppaman

+0

Создайте метод 'processData (String data)' или что-то еще в вашем классе encompassing и вызовите этот метод из вашего потока, когда вы закончите. Не забудьте обернуть его в 'runOnUiThread', если вы хотите, чтобы он переместился в основной поток. –

+0

Просто протестировано, но, к сожалению, ваше решение, похоже, не работает. Сообщение об ошибке исключения одно и то же: «Только исходный поток, создавший иерархию представлений, может коснуться его представлений». :-( – Suppaman

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