Мое приложение зависает при получении сообщения из очереди сообщений

Я создал очередь сообщений в службе сообщений AlibabaCloud. Я использую их Java SDK в Android для использования API. Я создал Async Task, которая продолжает прослушивать сообщения в отдельном потоке. Когда я отправляю сообщение через консоль в очередь, приложение зависает.

Ниже создан класс. Он будет запускаться при запуске приложения для прослушивания сообщений. Есть ли лучший способ справиться с этим?

public class RcvNtfcnTask extends AsyncTask<MNSClient, Integer, Void> {

private final static String TAG = "ReceiveNotificationTask";
private static AtomicBoolean continueLoop = new AtomicBoolean(true);

private static AtomicBoolean getContinueLoop() {
    return continueLoop;
}

public static void setContinueLoop(AtomicBoolean continueLoop) {
    RcvNtfcnTask.continueLoop = continueLoop;
}

Context mContext;

public RcvNtfcnTask(Context mContext) {
    this.mContext = mContext;
}


@Override
protected Void doInBackground(MNSClient... mnsClients) {


    MNSClient client = mnsClients[0];

    int i = 101;
    while (getContinueLoop().get()) {


        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {

            CloudQueue queue = null;
            Message popMsg = null;

            try {
                queue = client.getQueueRef(mContext.getString(R.string.QueueName_2));// replace with your queue name
                popMsg = queue.popMessage();
            } catch (NoClassDefFoundError t) {
                Log.d(TAG, "doInBackground: Throwable : " + t.getMessage());
            }

            if (popMsg != null) {
                i++;
                Log.d(TAG, "doInBackground: message handle: " + popMsg.getReceiptHandle());
                Log.d(TAG, "doInBackground: message body: " + popMsg.getMessageBodyAsString());
                Log.d(TAG, "doInBackground: message id: " + popMsg.getMessageId());
                Log.d(TAG, "doInBackground: message dequeue count:" + popMsg.getDequeueCount());

                Log.d(TAG, "doInBackground: msg Received" + popMsg.getMessageBodyAsString());
                //remember to  delete message when consume message successfully.

                NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(mContext)
                                .setSmallIcon(R.mipmap.ic_launcher_round)
                                .setContentTitle("Notification Demo")
                                .setDefaults(Notification.DEFAULT_ALL)
                                .setContentText(popMsg.getMessageBodyAsString());

                NotificationManager mNotificationManager =
                        (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

                mNotificationManager.notify(i, mBuilder.build());
                queue.deleteMessage(popMsg.getReceiptHandle());

                Log.d(TAG, "doInBackground: delete message successfully");
            } else {
                i = 101;
                Log.d(TAG, "doInBackground: No message");
            }


        } catch (NoClassDefFoundError e) {
            Log.d(TAG, "doInBackground: No Class Def Dound Error");
            e.printStackTrace();
        } catch (ClientException ce) {
            Log.d(TAG, "doInBackground: Thre is a problem with network and client connection");
            ce.printStackTrace();
        } catch (ServiceException se) {
            if (se.getErrorCode().equals("QueueNotExist")) {
                Log.d(TAG, "doInBackground: Queue is not exist.Please create queue before use");
            } else if (se.getErrorCode().equals("TimeExpired")) {
                Log.d(TAG, "doInBackground: The request is time expired. Please check your local machine timeclock");
            }

        } catch (Exception e) {
            Log.d(TAG, "doInBackground: Unknown exception happened!");
            e.printStackTrace();
        }
    }
    return null;
}}

0 ответов

Другие вопросы по тегам