Android 的 MQTT java 应用程序中的 setCallback 抛出错误

setCallback throwing error in MQTT java application for Android

我正在尝试为 Android 构建 MQTT "listener" 应用程序并使用 this sample application 作为模型。然而,原始示例抛出 "Network on Main Activity" 运行时错误,因此我被迫执行 AsyncTask class.

主应用程序作为服务运行:LWMQService.java[代码的相关部分在这里]

package org.iothub.lightwatchmq;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import org.iothub.lightwatchmq.PushCallback;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
import android.provider.Settings.Secure;

public class LWMQService extends Service implements SensorEventListener {

    -----

    String BROKER_URL = "tcp://test.mosquitto.org:1883";
    String TOPIC = "iothub";
    String TOPIC2 = "iothub2";
    String ClientID ;

    private MqttClient client;

   @Override
   public IBinder onBind(Intent arg0) {
      return null;
   }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {

      ------

       ClientID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

       try {

           client = new MqttClient(BROKER_URL, ClientID, new MemoryPersistence());
       } catch (MqttException e) {
           e.printStackTrace();
           System.exit(1);
       }
       new mConnect ().execute();
     //  new mTransmit ().execute();
       new mListen().execute();;

      Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
      Log.d(LogMsgID, "LightWatch Service started");
      return START_STICKY;
   }

   @Override
   public void onDestroy() {
      -----
      return;
   }

   private class mConnect extends AsyncTask<Void, Void, Void> {
         protected Void doInBackground(Void...dummy) {
             try {

                 client.connect();

             } catch (MqttException e) {
                 e.printStackTrace();
                 Log.d(LogMsgID, "Connect Failed");
                 System.exit(1);
             }
            return null;
         }
    }

   public class mListen extends AsyncTask<Void, Void, Void> {
         protected Void doInBackground(Void...dummy) {
             try {
                 client.setCallback(new PushCallback(this));
                 client.subscribe(TOPIC2);

             } catch (MqttException e) {
                 e.printStackTrace();
                 Log.d(LogMsgID, "Listen Failed");
                 System.exit(1);
             }
            return null;
         }
    }


   private class mTransmit extends AsyncTask<Void, Void, Void> {
         protected Void doInBackground(Void...dummy) {

            --------
         }

     }

   @Override
      public final void onAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
      }

    @Override
      public final void onSensorChanged(SensorEvent event) {
        // The light sensor returns a single value.
        ---
      }
}

mConnect 和 mTransmit(发布)classes 编译正确并且工作正常但是 mListen(订阅)class 我得到一个编译错误,指出 "The constructor PushCallback(LWMQService.mListen) is undefined" 显示在class

中的下一行
client.setCallback(new PushCallback(this));

PushCallback class 在不同的文件中可用:PushCallback.java

package org.iothub.lightwatchmq;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.util.Log;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.iothub.lightwatchmq.LWMQService.mListen;

public class PushCallback implements MqttCallback {

    String LogMsgID = "iothub: ";
    private ContextWrapper context;

    public PushCallback(ContextWrapper context) {

        this.context = context;
        Log.d(LogMsgID, "PCB-1");
    }

    @Override
    public void connectionLost(Throwable cause) {
        //We should reconnect here
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void messageArrived(String Topic, MqttMessage message) throws Exception {
        // TODO Auto-generated method stub

        final Intent intent = new Intent(context, MainActivity.class);
        final PendingIntent activity = PendingIntent.getActivity(context, 0, intent, 0);
        String RecdMessage = new String(message.getPayload());
        Log.d(LogMsgID, RecdMessage);

    }
}

我承认我不太擅长 Java 并且可能会犯一些明显的错误,但如果有人可以帮助我解决这个错误,我将不胜感激。

在您调用 client.setCallback(new PushCallback(this)); this 的范围内是 AsyncTask,因为 AsyncTask class 不扩展 ContextWrapper 它不会匹配构造函数。

将行改为

client.setCallback(new PushCallback(LWMQService.this));

获取正确的上下文对象