我怎么能停止我的AsyncTask线程。或者停止聊天管理员

时间:2013-04-23 11:35:13

标签: android xmpp smack asmack

我通过smack客户端使用xmpp开发了聊天应用程序。我使用后台线程来传入消息通知并正常工作。但现在当我在聊天视图时,我不想要传入消息的通知。所以我删除了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,我会感到困惑,那我怎么能阻止它呢?或者如何删除chatlistener?

请专家帮助我。

2 个答案:

答案 0 :(得分:0)

取消任务 可以通过调用cancel(boolean)随时取消任务。调用此方法将导致后续调用isCancelled()返回true。调用此方法后,将在doInBackground(Object [])返回后调用onCancelled(Object)而不是onPostExecute(Object)。为确保尽快取消任务,应始终定期从doInBackground(Object [])检查isCancelled()的返回值(如果可能)(例如在循环内)。

查看documentation了解更多信息。

答案 1 :(得分:0)

开始你的异步:

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);
  }