微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – AsyncTask和IllegalArgumentException

在我正在开发的应用程序中,当我触摸设备的屏幕时,我连接到服务器并使用AsyncTask显示忙碌的指示器,并且在此步骤中我没有
问题.但是当我连接并按下home buttom“应用程序进入onPause”并且我将应用程序再次显示为“onResume”并触摸屏幕
再次连接到服务器,我收到以下发布的logCat错误.

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

我不知道为什么我收到IllegalArgumentException,我读了一些关于它的postes,我测试了名为“client”的对象,它永远不会为null

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)

AsynchTask

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;
    }

在onPause:

@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 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;
    }
}

解决方法

我认为首先要学习的是完全阅读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类.也许这里的人可以帮助你,但是根据所提供的信息,这是我能回答的问题.希望这可以帮助.

原文地址:https://www.jb51.cc/android/315269.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐