1

我通过 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那么我该如何阻止它?或者我怎样才能删除我的聊天监听器?

请专家帮助我。

4

2 回答 2

0

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

检查文档以获取更多信息。

于 2013-04-23T11:37:29.800 回答
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);
  }
于 2013-04-23T11:39:02.507 回答