展讯SC7703天气预报功能总结

天气预报功能在我之前的文章https://blog.csdn.net/ljm_c_bok/article/details/78764305已经做过一些总结。这次在7703平台上,再开发一个天气预报功能,网络socket框架还是跟之前的文章一样的。还有一些问题点还需要重新认识一下。

一、socket封装HTTP协议,要封装好请求报文

      在CSDN上看到了大佬的文章https://blog.csdn.net/a19881029/article/details/14002273,感谢大佬分享。

      由于是socket直接发送请求,不像浏览器会给我们封装好请求报文,我们只要输入一个网址就行。所以我们在请求时,应当封装好符合规范的报文。

 

暂时遇到这么一个问题,有遇到新问题再来更新

 

二、thread  线程

    在之前的文章中我是将天气预报的socket的事件都注册在当前线程(TAPP task),由于在发送请求之后,需要在这里等待接收数据,所以使用了while(1)阻塞等待socket事件的到来,这会导致主线程全都被阻塞,所有的消息都不能被处理。发现这个问题是因为在弹出的等待窗口的动画会卡住。然后任意按多个案件,会导致案件失效。通过抓取log,发现是因为按键消息队列满。也就是说,此时的按键消息没有被处理,一直阻塞在队列里。对比其他的界面、任务。不会发生按键失效、按键消息队列满的情况。

    分析我的业务流程、首先怀疑当前TASK被阻塞。于是把当前的while(1)注释,发现不会出现按键失效的问题。于是在激活PDP的同时,创建了一个线程SCI_CreateThread,然后将socket的事件绑定在这个线程中处理,借助多线程完成任务,保证主线程不会阻塞。

    多线程这里还是出现了小插曲。我在新线程中等待socker的event,通过SCI_GetSignal从当前的TASK的消息队列得到信号,发现被阻塞在这里,也就是说消息队列此时为空,怎么回事?

1、排除了线程优先级

2、排除了我的请求正常发送(因为我并没有给TASK发送这些socket信号,这些消息是socket自己产生的,只有请求发送了,服务器端才会给我回应,这时才能有我所要监听的信号产生) 

转换一下思路。既然消息队列里是空的,那就是有可能根本没有消息到发送这个TASK,那么上诉第二点的验证是可以成立的,但是通过trace消息可以看到我的请求是发送成功的。继续在trace里抓取socke的状态,最后发现在请求发送之后,socke被close了,这也就是为什么注册在TASK里的事件为什么没有产生,都close了怎么可能产生。

Android天气预报实验报告模板 public class SetCityActivity extends Activity { //定义的一个自动定位的列表 private ListView gpsView; //定义的一个省份可伸缩性的列表 private ExpandableListView provinceList; //定义的用于过滤的文本输入框 private TextView filterText; //定义的一个记录城市码的SharedPreferences文件名 public static final String CITY_CODE_FILE="city_code"; //城市的编码 private String[][] cityCodes; //省份 private String[] groups; //对应的城市 private String[][] childs; //自定义的伸缩列表适配器 private MyListAdapter adapter; //记录应用程序widget的ID private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.set_city); gpsView = (ListView)findViewById(R.id.gps_view); provinceList= (ExpandableListView)findViewById(R.id.provinceList); //设置自动定位的适配器 gpsView.setAdapter(new GPSListAdapter(SetCityActivity.this)); //==============================GPS================================= //当单击自动定位时 gpsView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView localeCity = (TextView)view.findViewById(R.id.locateCityText); localeCity.setText("正在定位..."); final LocateHandler handler = new LocateHandler(localeCity); //添加一个线程来处理定位 new Thread(){ public void run() { Map<Integer, String> cityMap= getLocationCityInfo(); //记录匹配的城市的索引 int provinceIndex = -1; int cityIndex = -1; //传给处理类的数据封装对象 Bundle bundle = new Bundle(); if(cityMap!=null) { //得到图家名 String country = cityMap.get(LocationXMLParser.COUNTRYNAME); //只匹配中国地区的天气 if(country!=null&&country.equals("中国")){ //得到省 String province = cityMap.get(LocationXMLParser.ADMINISTRATIVEAREANAME); //得到市 String city = cityMap.get(LocationXMLParser.LOCALITYNAME); //得到区县 String towns = cityMap.get(LocationXMLParser.DEPENDENTLOCALITYNAME); Log.i("GPS", "============"+province+"."+city+"."+towns+"=============="); //将GPS定位的城市与提供能查天气的城市进行匹配 StringBuilder matchCity = new StringBuilder(city); matchCity.append("."); matchCity.append(towns); //找到省份 for(int i=0; i<groups.length; i++) { if(groups[i].equals(province)) { provinceIndex = i; break; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值