Nano Hash - криптовалюты, майнинг, программирование

Вручную убить поток javascript

Можно ли убивать темы в андроиде? Я вижу, что есть

Thread.currentThread().destroy();

который, однако, устарел и до сих пор не работает для меня. Сейчас я в Китае без работающего VPN, поэтому не могу читать Android dev, но я знаю, что там написано, что javascript, вставленный в веб-просмотр, будет выполняться в отдельном потоке.

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


  • нить? Как сделать поток нулевым? это не работает Thread.currentThread() = null; // 26.02.2015
  • вместо этого вы можете использовать runnable и обработчик.. используйте логическое значение, чтобы остановить runnable, как это void Run(){ if (!continue) { mhandler.post(this)} } 26.02.2015
  • на самом деле это то, на что я не смотрю, 2-й день моего поиска решения. Ищете способы реализации... Но разве сценарий не будет запускаться в отдельном несвязанном потоке? Я имею в виду, как только я запускаю его из своего обработчика? Как вы имеете в виду, что я должен реализовать это? 26.02.2015
  • Thread.interrupt() используйте это, если вам не нужны runnable и обработчик. Остановка потока 26.02.2015

Ответы:


1

Позвоните mWebView.destroy();, если хотите остановить JavaScript. У меня работает прекращение воспроизведения музыки после уничтожения Activity. Я вызываю этот метод в onDestroy() моей деятельности.

Вот документ этого метода:

общественная пустота уничтожить ()

Добавлено в уровень API 1. Уничтожает внутреннее состояние этого WebView. Этот метод следует вызывать после того, как этот WebView будет удален из системы просмотра. Никакие другие методы не могут быть вызваны в этом WebView после уничтожения.

Обновление:

Я нахожу другое рабочее решение. Его основная идея заключается в том, чтобы загрузить другой URL-адрес, если вы хотите остановить javascript в предыдущем URL-адресе. Таким образом, вы можете поместить пустой html-файл в свой актив и загрузить его, когда захотите остановить отнимающий много времени javascript. Код такой:

appWebView.loadUrl("file:///android_asset/infAppPaused.html");

См. сообщение здесь. .

Обновление 1: Наконец-то рабочее решение проблемы, описанной в этом посте.

Добавьте метод проверки состояния в класс JavaScriptInterface и вызовите этот метод во время цикла обработки и выйдите из цикла, если состояние не совпадает. Затем javascript остановится, если вы измените состояние на «состояние выхода», когда ваш фрагмент будет уничтожен.

Вот пример кода:

private boolean webviewAlive = true;
public class JavaScriptInterface {

    @JavascriptInterface
    public boolean checkState() {
        return webviewAlive;
    }

}

// Init WebView 
mWebView.addJavascriptInterface(new JavaScriptInterface(),
        "HtmlViewer");

// To stop the javascript loop
webviewAlive = false;

// Call check state method in javascript loop
if(!window.HtmlViewer.checkState()){
    // break the javascript
}
26.02.2015
  • Да, я уже пробовал это, и, похоже, это убивает веб-просмотр, но каким-то образом поток javascript, кажется, живет. Стоит отметить, что веб-просмотр размещается в фрагменте, а не в активности..... Но вы уверены, что ваш скрипт прерывается, когда вы закрываете активность? Он не живет тайно в вашем приложении, замедляя ресурсы, пока скрипт не завершит работу. Мой скрипт запускается около 2 минут, в этом проблема, даже если я убью веб-просмотр или фрагментирую, скрипт все равно будет жить в течение 2 минут. 26.02.2015
  • Okej прочитает эту страницу, но загрузку пустого URL я уже пробовал. Вчера я опубликовал вопрос об этом, сегодня я думаю о различных методах его решения, таких как закрытие потоков и т. Д. Вчерашнее сообщение: stackoverflow.com/questions/28714341/ 26.02.2015
  • Проблема в том, что после запуска javascript я не могу загрузить новый URL-адрес, даже пустой, до завершения сценария. 26.02.2015
  • @ user3711421 О, понятно. Я думаю, вам не следует использовать этот трудоемкий javascript, поскольку он работает в песочнице, которую мы не можем контролировать. Почему бы сначала не получить содержимое страницы и не обработать его с помощью собственного java-кода, а затем отправить результат в WebView, обработка контролируется с помощью этого метода. 26.02.2015
  • @user3711421 user3711421 У меня также есть другое решение: добавьте метод проверки состояния в свой класс JavaScriptInterface и вызовите этот метод во время цикла обработки и выйдите из цикла, если состояние не совпадает. Затем javascript остановится, если вы измените состояние на выход из состояния, когда ваш фрагмент будет уничтожен. 26.02.2015
  • Хм, на самом деле это действительно хорошая идея сделать это с помощью собственного кода, я думаю, это может сработать. Странно, почему я не подумал об этом раньше. Цель состоит в том, чтобы просто изменить содержимое HTML (что я делаю сейчас с помощью javascript), а не сохранить эту новую страницу как файл html локально. 26.02.2015
  • Мне это нравится, два решения, которые действительно могут решить проблему, сначала попробую второе, так как оно требует меньше изменений. И поскольку это может быть ответом на эти конкретные вопросы (и на самом деле несколько подобных вопросов без ответа здесь, на SO, которые я нашел во время поиска). 26.02.2015
  • Второе решение с логическим методом в интерфейсе работало хорошо, оно могло немного замедлить работу скрипта, так как теперь я должен проверять этот оператор if перед каждой итерацией, но замедление составило менее 10 секунд, что увеличило время выполнения максимум на 5%. . Теперь скрипт выглядит как for(24times) { if(window.HtmlViewer.isActive){RegExp}};... Отредактируйте свой ответ, как вы думаете, со вторым решением, и я могу отметить этот ответ как правильный. 26.02.2015
  • Большое спасибо, я бы тоже застрял с этим сегодня .. :) 26.02.2015
  • @ user3711421 Нет проблем. 26.02.2015

  • 2

    Попробуйте Thread.currentThread().interrupt();, а затем установите для своего потока значение null.

    Изменить

    Согласно javadocs, currentThread() захватывает, ну, «выполняемый в настоящее время объект потока», который, как я предполагаю, захватывает ваш поток, если он работает. Если вы хотите получить более подробную информацию о том, какой поток вы используете, вы можете сделать

        //get a reference
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
    
            }
        });
    
        //kill the thread
        t.interrupt();
        t = null;
    

    Редактировать О, да, я не заметил всей этой штуки с "javascript в веб-просмотре". Виноват. Не могли бы вы опубликовать немного вашей текущей реализации?

    26.02.2015
  • Как установить поток равным нулю? И есть ли способ узнать, какой поток использует javascript? currentThread() - это просто предположение с моей стороны. 26.02.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..