我通过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?
答案 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);
}