我怎样才能阻止我的AsyncTask线程。或停止chatmanager

问题描述:

我开发的聊天应用程序使用XMPP由smack客户端。我使用后台线程传入消息通知和工作正常。但现在当我在聊天视图然后我不想通知传入消息。所以我删除了chatmangerlistener。但它不起作用。我怎样才能阻止我的AsyncTask线程。或停止chatmanager

我用我的第二种方法,当我进入聊天视图时,我的后台线程将会关闭。但我看到后台线程没有关闭或停止。 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?

请高手帮帮我。

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

检查documentation更多。

+0

感谢ü。但可能在我的上述代码中? – user2160008 2013-04-23 12:02:57

+0

@ user2160008不,但我懒得写你的代码免费正常,即使没有一个upvote :) – 2013-04-23 12:24:33

+0

plz帮助我。你的帮助可能会对我很满! – user2160008 2013-04-24 11:52:05

开始你异步:

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

thx但我使用它新incomingmsg()。execute(); – user2160008 2013-04-23 11:47:01

+0

所以我需要改变**新incomingmsg().execute()** – user2160008 2013-04-23 11:48:00

+0

即时仍然没有工作 – user2160008 2013-04-23 12:02:23