人走茶凉|一个监控PLC的Android应用的开发过程-2( 二 )


最后 , 经过在网上查找发现了网友们都说将LongClick的返回值设置了为false就可以实现在松开后让Click响应 , 但是我的OnListItemLongClick是没有返回值的!What?不过我想应该不是网友们写的不对 , 应该是我没有搞懂!这就是使用C#的Xamarin的郁闷之处 , 资料太少了!好吧只能自己沉下心来继续研究 , 最后还是在MS提供的示例中找到了具体的实现方法 , 不是使用现成的事件 , 而是设置监听函数 , 代码如下:
public class LongClickListener : Object, AdapterView.IOnItemLongClickListener{public MainActivity that;public bool OnItemLongClick(AdapterView parent, View view, int position, long id){if (that.ActionBar.SelectedNavigationIndex == 1var item = ((HomeScreenAdapter)that.listView.Adapter).GetTableItem(position);that.SetItemDO(item.itemName, item.itemValue, true);}return false;// false, 松开屏幕后Click事件响应;true , Click事件不响应 。}}public class ClickListener : Object, AdapterView.IOnItemClickListener{public MainActivity that;public void OnItemClick(AdapterView parent, View view, int position, long id){var item = ((HomeScreenAdapter)that.listView.Adapter).GetTableItem(position);Toast.MakeText(that, item.itemName, Android.Widget.ToastLength.Short).Show();switch (that.ActionBar.SelectedNavigationIndex){case 1:// DOthat.SetItemDO(item.itemName, item.itemValue, false);break;case 2:// AIthat.ShowDataChart(true, item.itemName);break;case 3:// AOthat.ClickItemAO(item.itemName, item.itemValue);break;default:break;}}}2.7.2 增加网络连接状态的指示灯显示目前的界面如下:
人走茶凉|一个监控PLC的Android应用的开发过程-2界面显示
初步考虑 , 似乎没有合适的地方再增加一个指示灯了 , 于是想能否通过修改App的名称来增加状态显示?比如将现有的“液压起重“修改为”液压起重-状态:网络连接/网络断开”?研究了一下居然没弄懂怎么改!那位博友知道望告知 , 先谢了!虽然此种方式没有实现 , 但是无意间发现虽然文字不会改 , 但是背景色是可以改的 , 于是但网络断开连接的时候就变成了下面这样:
人走茶凉|一个监控PLC的Android应用的开发过程-2断网显示
这样也算是变相的指示灯吧!
3.遇到的问题3.1弹出对话框卡顿现象描述:点击List中的item后 , 弹出的对话框有时会延时一会才弹出来 。
问题调试:调试时发现在弹出对话框前的“OnListItemClick”事件中多加了一句“lock (lockDatas)” , 而这个锁是用来进行数据读写同步 , 也就是在点击Item后需要等待当前的读写过程完成才能弹出对话框 , 也就是这导致了弹出延时 , 其实时没有必要的 。
解决方法:删除语句“lock (lockDatas)” , 问题解决 。
3.2趋势显示卡顿现象描述:当弹出趋势界面时 , 时常会出现卡住不现实趋势线 , 然后过一段时间后才显示出来的问题 。
问题调试:这个问题调试起来复杂了一些 , 一个是跟上面的问题类似有同步的问题 , 而且同时还发现每次关闭趋势界面再打开发现多了一个线程在读取数据 , 或者换句话说就是关闭的趋势界面并没有真正退出 , 而是在后台继续运行 。 主要是线程没有退出导致的 。
解决方法:1.正确同步;2.保证趋势界面关闭后线程随即退出 。
3.3读取PLC数据的线程位置问题起初写的代码循环读取PLC数据的线程我是放到了主界面也就是“Activity”的派生类中 , 但是测试过程中发现在通讯过程中只要一旋转设备屏幕 , 通讯就会中断重连?后来才发现原来旋转屏幕时整个“Activity”会重新创建 , 这样来看这种需要长期运行的实时数据读取线程就不适合放在“Activity”派生类中来实现了 , 那么放在哪了合适?我想到了“Application”的派生类 , 测试了一下 , 果然无论设备如何旋转此类都只有在初始时创建一次!


推荐阅读