BlackBerry: обработка запущенных потоков при нажатии на другой экран - PullRequest
0 голосов
/ 09 января 2012
ImageThread it = new ImageThread(this.imageURL,this);

        Thread t = new Thread(it);
        t.start();

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

Независимо от того, загружают ли мои потоки изображение или какой-то jsonПо-видимому, они все еще загружаются, даже если пользователь вставил новый экран в приложение uiapplication.Эта непрерывная загрузка может быть проблемой, если пользователь заходит на экран, а затем быстро обращается к другому.В результате последний экран, на котором они находятся, завершает свой поток только тогда, когда другие сделаны.

Что я должен делать с моими темами, которые будут считаться ответственными?Я не хочу, чтобы мое приложение было завязано очередью потоков.Как, скажем, отменить загрузку при смене экрана?

Я пишу этот вопрос на Java, так как думаю, что процесс тот же.

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Вы можете принудительно закрыть ваши потоки, оставив открытый метод close() внутри вашего класса, который расширяет Thread:

private class MyConnectionThread extends Thread {
        /** determines whether the thread is runnuing or not. */
        private boolean alive = false;
        private HttpConnection hconn = null; // or whatever connection method you want to use ( SocketConnection etc.)
        private InputStream inputStream = null; // or DataInputStream etc...

        public MyConnectionThread() {
            alive = false;
            // ...
            // ...
        }

        public void run() {
            alive = true;
            try {
                String connection_parameter = ";deviceside=false"; // [For BlackBerry: ] this parameter is for connection using MDS, need to add different parameters for different connection methods.
                hconn = (HttpConnection) Connector.open("http://your_url.com"+connection_parameter);
                int response = hconn.getResponseCode();
                if (response == HttpConnection.HTTP_OK) {
                    inputStream = hconn.openInputStream();

                    // process the result here by reading the inputStream ...
                    // ...
                    // ...
                }

                inputStream.close();
                hconn.close();

            }catch(Exception excp) {
                // Handle Exceptions here...
            }catch (Throwable e) {
               // Exception in reading inputStream
            }finally{
                alive = false;
                this.interrupt();
            }
        }

        /**
         * Forces the connection to close anytime.
         */
        public void closeConnection() {
            alive = false;
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                inputStream = null;
                if (hconn != null) {
                    hconn.close();
                }
                hconn = null;
                this.interrupt();
            } catch (Exception excp) {
                // Handle Exception here...
                System.out.println("Exception in closing HttpConnection: " + excp.toString());
            }
        }
    }

Теперь, когда вы переходите на другой экран, вам просто нужно вызвать метод MyConnectionThread.closeConnection(), чтобы принудительно закрыть этот поток.

См. Также:

  1. как к прерыванию-а-нить-в-быстро и очищаемый-путь-в-Java

  2. Как мы можем убить работающий поток в Java?

  3. Как остановить поток или задачу

Надеюсь, они вам пригодятся.

0 голосов
/ 09 января 2012

Как @Rupak предложил вам создать метод (например, используя isDisplayed()):

boolean isScreenOnTop()

и передать его в Thread (лучше по интерфейсу StopCondition.shouldStop()).И изменить ваш алгоритм загрузки на следующий:

while(moreDataAvailable() && !topCondition.shouldStop()) {
   loadNextDataChunk();
}

if (!topCondition.shouldStop()) {
   notifyDataDownloaded();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...