1

smack client で xmpp を使ってチャットアプリを開発しました。着信メッセージ通知にバックグラウンド スレッドを使用し、正常に動作しました。しかし、チャットビューにいるときは、着信メッセージの通知は必要ありません。そのため、chatmangerlistener を削除しました。しかし、それは機能していません。

2 つ目の方法を使用して、チャット ビューに入ったときにバックグラウンド スレッドを閉じるようにしました。しかし、バックグラウンド スレッドが閉じたり停止したりしていないことがわかりました。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 が返されます。このメソッドを呼び出すと、onPostExecute(Object) の代わりに onCancelled(Object) が doInBackground(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 に答える