【问题标题】:AsyncTask and IllegalArgumentExceptionAsyncTask 和 IllegalArgumentException
【发布时间】:2015-05-10 16:42:31
【问题描述】:

在我正在开发的应用程序中,当我触摸设备的屏幕时,我连接到服务器并使用 AsyncTask 显示忙碌指示器,在这一步我没有 问题。但是当我连接并按下主页按钮时“应用程序进入 onPause”,我让应用程序再次可见“onResume”并触摸屏幕 要再次连接到服务器,我收到以下发布的 logCat 错误。

注意:在 onPause 中,我 urnRegister WiFi 接收器并断开与服务器的连接。 logCat 输出显示了 AsyncTask 调用回调的顺序

我不知道为什么我会收到 IllegalArgumentException,我阅读了一些关于它的帖子并测试了名为“客户端”的对象,它永远不会为空

LogCat

03-09 14:26:13.413: D/MainActivity(17065): @MQTTAsynchTask(): constructor called
03-09 14:26:13.413: D/MainActivity(17065): @MQTTAsynchTask(): client is not null
03-09 14:26:13.413: D/MainActivity(17065): @MQTTAsynchTask(): onPreExecute().
03-09 14:26:13.422: D/MainActivity(17065): @MQTTAsynchTask(): doInBackground().
03-09 14:26:13.433: E/AndroidRuntime(17065): FATAL EXCEPTION: pool-1-thread-1
03-09 14:26:13.433: E/AndroidRuntime(17065): Process: com.example.mqtt_designlayout_02, PID: 17065
03-09 14:26:13.433: E/AndroidRuntime(17065): java.lang.IllegalArgumentException: Invalid ClientHandle
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttService.getConnection(MqttService.java:552)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttService.connect(MqttService.java:318)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttAndroidClient.doConnect(MqttAndroidClient.java:427)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttAndroidClient.access$2(MqttAndroidClient.java:417)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttAndroidClient$1.run(MqttAndroidClient.java:395)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-09 14:26:13.433: E/AndroidRuntime(17065):    at java.lang.Thread.run(Thread.java:818)

异步任务

public MQTTAsynchTask(Context contex, MqttAndroidClient client, MqttConnectOptions opts) {
        // TODO Auto-generated constructor stub
        Log.d(TAG, "@MQTTAsynchTask(): constructor called");
        this.context = contex;
        this.MQTTAndroidClient = client;
        if (client != null) {
            Log.d(TAG, "@MQTTAsynchTask(): client is not null");
        }
        this.opts = opts;
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        Log.d(TAG, "@MQTTAsynchTask(): onPreExecute().");

        dialog = new Dialog(this.context);
        dialog.setCancelable(false);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.progressdialog);
        progressBar = (ProgressBar) dialog.findViewById(R.id.progressBar1);
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        Log.d(TAG, "@MQTTAsynchTask(): doInBackground().");
        do {
            try {
                this.MQTTAndroidClient.connect(this.opts, this.context, synchCONNCallBack);
            } catch (MqttSecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                Thread.sleep(MQTT_BROKER_TIME_OUT);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            this.totalTimeOut += MQTT_BROKER_TIME_OUT;

        } while ( (!this.isCancelled()) && (this.MQTTAndroidClient != null) && (!this.MQTTAndroidClient.isConnected()) && (this.totalTimeOut <= (10 * MQTT_BROKER_TIME_OUT)) );

        return null;
    }

暂停

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.w(TAG, "@onPause()");

    this.onPauseCalled = true;

    if (reconnectTimerCurrentlyActive) {
        reconnectTimerCurrentlyActive = false;
        reconnectTimer.cancel();
        reconnectTimer.purge();
        Log.v(TAG, "reconnect timer set to 'false', and reconnectTimer is cancelled");
    }

    if (this.MQTTAsynch != null) {
        Log.d(TAG, "asynchTask object was initilised");
        if (this.MQTTAsynch.getStatus() == AsyncTask.Status.PENDING) {
            Log.d(TAG, "AsynchTask has not started yet.");
            boolean cancelledSuccessully = this.MQTTAsynch.cancel(true);
            if (cancelledSuccessully) {
                Log.d(TAG, "AsynchTask is cancelled successfully.");
            } else {
                Log.d(TAG, "AsynchTask failed to cancell");
            }
        }
        if (this.MQTTAsynch.getStatus() == AsyncTask.Status.RUNNING) {
            Log.d(TAG, "AsynchTask still running doing work in the backgroung thread, and it will be intrrupted");
            boolean cancelledSuccessully = this.MQTTAsynch.cancel(true);
            if (cancelledSuccessully) {
                Log.d(TAG, "AsynchTask is cancelled successfully.");
            } else {
                Log.d(TAG, "AsynchTask failed to cancell");
            }
        }
        if (this.MQTTAsynch.getStatus() == AsyncTask.Status.FINISHED) {
            Log.d(TAG, "AsynchTask has finished its work.");
        }
    } else {
        Log.d(TAG, "asynchTask object was not initilised. this.MQTTAsynch == null");
    }

    if ( (this.subActivityReturned) || (this.isConnectCalled) ) {
        MQTT_Disconnect_Module();
    }

    if (MQTTPrimaryReceiverRegistered) {
        unregisterReceiver(MQTTPrimaryReceiver);
        Log.v(TAG, "BroadCastReceiver (MQTTPrimaryReceiver) unregistered");
        MQTTPrimaryReceiverRegistered = false;
    }
}

【问题讨论】:

  • 你找到解决办法了吗?
  • 问题不是您的客户端,也不是 NullPointerException(客户端为空),错误开始于此类:MqttService,第 552 行,并在 MqttAndroidClient 上继续。我建议你检查一下
  • @rmaik。我也遇到了同样的问题,请问您找到解决方法了吗?

标签: android android-asynctask mqtt


【解决方案1】:

我认为首先要学习的是完整阅读ErrorLogs并理解它。 stacktrace 的第一行说

03-09 14:26:13.433: E/AndroidRuntime(17065): java.lang.IllegalArgumentException: Invalid ClientHandle
03-09 14:26:13.433: E/AndroidRuntime(17065):    at org.eclipse.paho.android.service.MqttService.getConnection(MqttService.java:552)

即错误开始于方法getConnection() 中的MqttService 类。方法getConnection() 是抛出IllegalArgumentException 而不是AsyncTask。它恰好是从AsyncTask 内部调用的。此外,变量 ClientHandle 不是 Android API 的一部分,它是您的 MqttService 的一部分。这个变量实际上是无效的,正在导致异常。

如果您不知道为什么变量 ClientHandle 无效,您也可以分享您的 MqttService 课程。也许这里的人可以在这方面为您提供帮助,但是根据提供的信息,这就是我可以回答的。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2014-01-07
    相关资源
    最近更新 更多