Android 自定义Dialog 显示不显示问题??

gd6321374 2017-08-15 09:57:54

新手,请教。小弟使用自定义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;
}
}
};



请问一个各位大神有没有遇过这种问题,小弟是新手,请指教,谢谢了。
...全文
1300 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gd6321374 2017-08-18
  • 打赏
  • 举报
回复
引用 8 楼 luosiye312 的回复:
根据上面所说,那么可以肯定错误的原因是:在UI线程之外更新了UI。 应该是你的Handler没有处理好。 本人觉得,接口还是最好用的,可以试试用接口来处理数据返回后去更新UI这个问题。
???? handler 不是用来在线程中,发送消息,然后在UI线程中更新UI???????
ganshenml 2017-08-17
  • 打赏
  • 举报
回复
引用 6 楼 gd6321374 的回复:
[quote=引用 4 楼 ganshenml 的回复:] [quote=引用 2 楼 gd6321374 的回复:] [quote=引用 1 楼 ganshenml 的回复:] 闪退了应该不是这个错误。日志发全一点看看
你好,下面是完整的日志,请看看,谢谢。

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
[/quote]没接触过这类异常。你先看看楼下的解决方案有没有效果。[/quote] 如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。 但是,只要Adapter 里面有数据,就会出现上面的问题,还是找不到原因,快无语了。 这个跟广播接收器有关吗???还是Handler 显示对话框有问题??? 不是都是在UI线程显示对话框吗????? [/quote]所以你这个闪退应该是数据相关的。那么你的日志是看不出这点的。
gd6321374 2017-08-17
  • 打赏
  • 举报
回复
引用 4 楼 ganshenml 的回复:
[quote=引用 2 楼 gd6321374 的回复:] [quote=引用 1 楼 ganshenml 的回复:] 闪退了应该不是这个错误。日志发全一点看看
你好,下面是完整的日志,请看看,谢谢。

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
[/quote]没接触过这类异常。你先看看楼下的解决方案有没有效果。[/quote] 如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。 但是,只要Adapter 里面有数据,就会出现上面的问题,还是找不到原因,快无语了。 这个跟广播接收器有关吗???还是Handler 显示对话框有问题??? 不是都是在UI线程显示对话框吗?????
gd6321374 2017-08-17
  • 打赏
  • 举报
回复
引用 3 楼 alexxm_001 的回复:
百度下,有一个以下的解决方法 http://blog.csdn.net/a5nan/article/details/51517 根据这个log找到了解决方案:android studio 2.0中使用了instant run功能,把这个功能关闭就ok了。因为instant run本身的机制影响了一些classloader的加载。
是这样子的,如果,我不往mListBluetoothLEGattServiceJaveBean这个List 添加数据,及Adapter 为空的时候,对话框是可以显示出来的。 但是,只要Adapter 里面有数据,就会出现上面的问题。 都调试了很久,无论是单步调试,还是其他的,还是找不到原因,快无语了。
ganshenml 2017-08-17
  • 打赏
  • 举报
回复
引用 2 楼 gd6321374 的回复:
[quote=引用 1 楼 ganshenml 的回复:] 闪退了应该不是这个错误。日志发全一点看看
你好,下面是完整的日志,请看看,谢谢。

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
[/quote]没接触过这类异常。你先看看楼下的解决方案有没有效果。
辉_alexxm 2017-08-17
  • 打赏
  • 举报
回复
百度下,有一个以下的解决方法 http://blog.csdn.net/a5nan/article/details/51517 根据这个log找到了解决方案:android studio 2.0中使用了instant run功能,把这个功能关闭就ok了。因为instant run本身的机制影响了一些classloader的加载。
luosiye312 2017-08-17
  • 打赏
  • 举报
回复
根据上面所说,那么可以肯定错误的原因是:在UI线程之外更新了UI。 应该是你的Handler没有处理好。 本人觉得,接口还是最好用的,可以试试用接口来处理数据返回后去更新UI这个问题。
ganshenml 2017-08-16
  • 打赏
  • 举报
回复
闪退了应该不是这个错误。日志发全一点看看
gd6321374 2017-08-16
  • 打赏
  • 举报
回复
引用 1 楼 ganshenml 的回复:
闪退了应该不是这个错误。日志发全一点看看
你好,下面是完整的日志,请看看,谢谢。

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

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧