как я могу остановить свой поток AsyncTask. или остановите менеджер чата

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

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

это код: -

 public class incomingmsg extends AsyncTask<String, Void, String>
    {
      String msg;
        protected  String doInBackground(String... urls) {

            connection =  XMPPLogic.getInstance().getConnection();

            // register listeners
              ChatManager chatmanager = connection.getChatManager();
              chatmangerlistnr = new ChatManagerListener()
              {

                @Override
                public void chatCreated(final Chat chat, final boolean createdLocally) {
                    chat.addMessageListener(new MessageListener()
                      {
                        @Override
                        public void processMessage(Chat chat, Message message) {
                            msg = message.getBody();
                            System.out.println("Received message: " 
                                        + (message != null ? message.getBody() : "NULL"));
                            GeneratNotification(msg);
                        }
                      });
                }
              };

              connection.getChatManager().addChatListener(chatmangerlistnr);

              // idle for 20 seconds
            /* final long start = System.nanoTime();
              while ((System.nanoTime() - start) / 1000000 < 20000) // do for 20 seconds
              {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
              }
              */
              System.out.println("is cancellable "+this.isCancelled());
            return msg;
        } 

          protected void onPostExecute(String r) {
             // GeneratNotification(r);

           }
    }

Я в замешательстве, если метод isCancellable() - это false, то как я могу его остановить? или как я могу удалить прослушиватель чата?

пожалуйста, эксперт, помогите мне.


person user2160008    schedule 23.04.2013    source источник


Ответы (2)


Отмена задачи Задачу можно отменить в любое время, вызвав команду cancel(boolean). Вызов этого метода приведет к тому, что последующие вызовы isCancelled() вернут true. После вызова этого метода onCancelled(Object) вместо onPostExecute(Object) будет вызываться после возврата doInBackground(Object[]). Чтобы убедиться, что задача отменена как можно быстрее, вы всегда должны периодически проверять возвращаемое значение isCancelled() из doInBackground(Object[]), если это возможно (например, внутри цикла).

Дополнительные сведения см. в документации.

person Community    schedule 23.04.2013
comment
@user2160008 user2160008 нет, но мне лень писать ВАШ код бесплатно нормально, даже ни одного плюса :) - person ; 23.04.2013
comment
Пожалуйста, помогите мне. ваша помощь может быть большой полной для меня! - person user2160008; 24.04.2013

чтобы начать асинхронно:

incomingmsg aTask = new incomingmsg();     
aTask.execute(...);

чтобы остановить вас асинхронно

aTask.cancel(true);

по соглашению использует имя своего класса, начинающееся с заглавной буквы

public class incomingmsg extends AsyncTask<String, Void, String>...

изменить на:

public class Incomingmsg extends AsyncTask<String, Void, String>...

но это просто хорошая практика

Полный пример:

AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {                   
                        //do this test ever step of you async task.                        
                        if(!isCancelled()){     
                         //do something here
                        }
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        myTask = null;
                    }

                };

  //here u start u task:
  myTask.execute(null, null, null);
  if(myTask != null){
   //here u stop u task:
   myTask.cancel(true);
  }
person rcorbellini    schedule 23.04.2013
comment
так что мне нужно изменить в new incomingmsg().execute() - person user2160008; 23.04.2013
comment
в doInBackground вам нужно всегда проверять, не отменена ли задача, чтобы что-то сделать.... я снова отредактирую.... - person rcorbellini; 24.04.2013