新手,请教。小弟使用自定义Dialog和ExpandableListView 显示数据,但是却导致整个Activity闪退。
我思路是,使用Service 监听蓝牙BLE的广播的数据,然后Service通过Brodcast 的形式,将数据发送到Activity中,
然后,Activity的BroadcasrReciver 通过Hanler 显示对话框。 结果,就闪退了。。显示如下错误:
08-15 21:37:27.427 16027-16027/? I/art: Late-enabling -Xcheck:jni
08-15 21:37:27.517 16027-16027/com.ble W/System: ClassLoader referenced unknown path: /data/app/com.ble-1/lib/arm这个问题困扰好久了,请指教。代码如下:自定义对话框类public class ShowDialg
{
    public static Dialog CreateShowListViewDialog(final Context context, String title, final BluetoothGattServiceAdapter bluetoothGattServiceAdapter)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        View contentView = layoutInflater.inflate(R.layout.activity_dialog, null);        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setView(contentView);
        builder.setTitle(title);
        final ExpandableListView listView = (ExpandableListView) contentView.findViewById(R.id.lv_dialog);
        try
        {
            listView.setAdapter(bluetoothGattServiceAdapter);
        }
        catch (Exception E)
        {
            E.printStackTrace();
        }
        return builder.create();
    }
}广播接收  private BroadcastReceiver mBluetoothLEBroadcaseReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            String action = intent.getAction();
            switch (action)
            {
                //查找设备成功,填充LISTVIEW
                case BluetoothLEFinalStaticValue.BLUETOOTH_ACTION_START_DISCOVERY_DEVICE:
                    Log.d(TAG, "连接设备成功...");
                    addList(mBluetoothLeService.getBluetoothLESupportService());
                    break;
            }
        }
    };addList() 方法   public void addList(List<BluetoothGattService> bluetoothGattServiceList)
    {
        String uuid;
        String rwString = new String();
        String unknownServiceString = "Unknown service";
        String unknownCharaString = "Unknown characteristic";        BluetoothGattService bluetoothGattService;
        BluetoothLEGattServiceJaveBean bluetoothLEGattServiceJaveBean;
        BluetoothLEGattCharacterJaveBean bluetoothLEGattCharacterJaveBean;
        BluetoothGattCharacteristic bluetoothGattCharacteristic;
        List<BluetoothGattCharacteristic> bluetoothGattCharacteristicList;        for(int ik=0; ik<bluetoothGattServiceList.size(); ik++)
        {
            bluetoothLEGattServiceJaveBean = new BluetoothLEGattServiceJaveBean();            bluetoothGattService = bluetoothGattServiceList.get(ik);
            bluetoothGattCharacteristicList = bluetoothGattService.getCharacteristics();            uuid = bluetoothGattService.getUuid().toString();
            bluetoothLEGattServiceJaveBean.setmSeriveUUID(uuid);            bluetoothLEGattServiceJaveBean.setmSeriveuuidStringName(SampleGattAttributes.lookup(uuid, unknownServiceString));            //在一个Service里面包含多个特征值
            for(int jk=0; jk<bluetoothGattCharacteristicList.size(); jk++)
            {
                bluetoothLEGattCharacterJaveBean = new BluetoothLEGattCharacterJaveBean();
                bluetoothGattCharacteristic = bluetoothGattCharacteristicList.get(jk);                int charaProp = bluetoothGattCharacteristic.getProperties();                if ((charaProp & BluetoothGattCharacteristic.PROPERTY_READ) > 0)
                {
                    rwString = "可读 ";
                }                if ((charaProp & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0)
                {
                    rwString = rwString + "可写 ";
                }                if ((charaProp & BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0)
                {
                    rwString = rwString + "可通知";
                }                if(rwString.equals(""))
                {
                    rwString = "UnKonw properties = " + charaProp;
                }                uuid = bluetoothGattCharacteristic.getUuid().toString();
                bluetoothLEGattCharacterJaveBean.setmCharacterUUID(uuid);
                bluetoothLEGattCharacterJaveBean.setmCaracteruuidStringName(SampleGattAttributes.lookup(uuid, unknownCharaString));
                bluetoothLEGattCharacterJaveBean.setmRWString(rwString);                bluetoothLEGattServiceJaveBean.getBluetoothLEGattCharacterJaveBeanList().add(bluetoothLEGattCharacterJaveBean);                Log.d("特征值 uuid = ", uuid);
                Log.d("character = " + charaProp, "rwString = " + rwString);                rwString = "";
            }            mListBluetoothLEGattServiceJaveBean.add(bluetoothLEGattServiceJaveBean);
            mBluetoothGattServiceAdapter.notifyDataSetChanged();
    
            Message msg = Message.obtain();
            msg.what = BluetoothLEFinalStaticValue.SHOW_DIALOG;
             mHandler.sendMessage(msg);
        }
    } public Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case BluetoothLEFinalStaticValue.SHOW_DIALOG:
                    if(!mIsCreted)
                    {
                        Log.d(TAG, "第一次显示.......");
                        mIsCreted = true;
                        mDialog = ShowDialg.CreateShowListViewDialog(DeviceControlActivity.this,  mTvDeviceName.getText().toString(), mBluetoothGattServiceAdapter);
                    }                 
                       mDialog.show();           
                    break;
            }
        }
    };请问一个各位大神有没有遇过这种问题,小弟是新手,请指教,谢谢了。

解决方案 »

  1.   


    你好,下面是完整的日志,请看看,谢谢。
    08-16 20:01:17.828 19999-19999/? I/art: Late-enabling -Xcheck:jni
    08-16 20:01:17.888 19999-19999/com.ble W/System: ClassLoader referenced unknown path: /data/app/com.ble-2/lib/arm
    08-16 20:01:17.992 19999-20031/com.ble D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
    08-16 20:01:17.998 19999-19999/com.ble D/ActivityThreadInjector: clearCachedDrawables.
    08-16 20:01:18.046 19999-20031/com.ble I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
                                                         OpenGL ES Shader Compiler Version: E031.29.00.00
      

  2.   

    百度下,有一个以下的解决方法
    http://blog.csdn.net/a5nan/article/details/51517根据这个log找到了解决方案:android studio 2.0中使用了instant run功能,把这个功能关闭就ok了。因为instant run本身的机制影响了一些classloader的加载。
      

  3.   


    你好,下面是完整的日志,请看看,谢谢。
    08-16 20:01:17.828 19999-19999/? I/art: Late-enabling -Xcheck:jni
    08-16 20:01:17.888 19999-19999/com.ble W/System: ClassLoader referenced unknown path: /data/app/com.ble-2/lib/arm
    08-16 20:01:17.992 19999-20031/com.ble D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
    08-16 20:01:17.998 19999-19999/com.ble D/ActivityThreadInjector: clearCachedDrawables.
    08-16 20:01:18.046 19999-20031/com.ble I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
                                                         OpenGL ES Shader Compiler Version: E031.29.00.00
    没接触过这类异常。你先看看楼下的解决方案有没有效果。
      

  4.   


    是这样子的,如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。
    但是,只要Adapter 里面有数据,就会出现上面的问题。
    都调试了很久,无论是单步调试,还是其他的,还是找不到原因,快无语了。
      

  5.   


    你好,下面是完整的日志,请看看,谢谢。
    08-16 20:01:17.828 19999-19999/? I/art: Late-enabling -Xcheck:jni
    08-16 20:01:17.888 19999-19999/com.ble W/System: ClassLoader referenced unknown path: /data/app/com.ble-2/lib/arm
    08-16 20:01:17.992 19999-20031/com.ble D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
    08-16 20:01:17.998 19999-19999/com.ble D/ActivityThreadInjector: clearCachedDrawables.
    08-16 20:01:18.046 19999-20031/com.ble I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
                                                         OpenGL ES Shader Compiler Version: E031.29.00.00
    没接触过这类异常。你先看看楼下的解决方案有没有效果。
    如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。
    但是,只要Adapter 里面有数据,就会出现上面的问题,还是找不到原因,快无语了。这个跟广播接收器有关吗???还是Handler 显示对话框有问题???
    不是都是在UI线程显示对话框吗?????
      

  6.   


    你好,下面是完整的日志,请看看,谢谢。
    08-16 20:01:17.828 19999-19999/? I/art: Late-enabling -Xcheck:jni
    08-16 20:01:17.888 19999-19999/com.ble W/System: ClassLoader referenced unknown path: /data/app/com.ble-2/lib/arm
    08-16 20:01:17.992 19999-20031/com.ble D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
    08-16 20:01:17.998 19999-19999/com.ble D/ActivityThreadInjector: clearCachedDrawables.
    08-16 20:01:18.046 19999-20031/com.ble I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
                                                         OpenGL ES Shader Compiler Version: E031.29.00.00
    没接触过这类异常。你先看看楼下的解决方案有没有效果。
    如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。
    但是,只要Adapter 里面有数据,就会出现上面的问题,还是找不到原因,快无语了。这个跟广播接收器有关吗???还是Handler 显示对话框有问题???
    不是都是在UI线程显示对话框吗?????
    所以你这个闪退应该是数据相关的。那么你的日志是看不出这点的。
      

  7.   

    根据上面所说,那么可以肯定错误的原因是:在UI线程之外更新了UI。
    应该是你的Handler没有处理好。
    本人觉得,接口还是最好用的,可以试试用接口来处理数据返回后去更新UI这个问题。
      

  8.   

    ????
    handler 不是用来在线程中,发送消息,然后在UI线程中更新UI???????