鍍金池/ 問(wèn)答/Java  Android/ Android開發(fā)板長(zhǎng)時(shí)間開啟線程讀取串口數(shù)據(jù)app自動(dòng)關(guān)閉的問(wèn)題

Android開發(fā)板長(zhǎng)時(shí)間開啟線程讀取串口數(shù)據(jù)app自動(dòng)關(guān)閉的問(wèn)題

應(yīng)公司要求,最近使用了android開發(fā)板,開發(fā)了一套通過(guò)串口去接收探頭傳送過(guò)來(lái)的溫濕度數(shù)據(jù)的app。主要目的還是為了一直采集數(shù)據(jù),將數(shù)據(jù)用于分析,故要求app能夠長(zhǎng)時(shí)間穩(wěn)定的運(yùn)行。

首先已經(jīng)將主Activity設(shè)置為常亮狀態(tài)

clipboard.png

但在實(shí)際使用過(guò)程中,發(fā)現(xiàn)經(jīng)常程序采集兩三天之后,app已自動(dòng)關(guān)閉,并且在已經(jīng)全局捕獲異常的情況下,沒(méi)有抓到任何的報(bào)錯(cuò)報(bào)文。

于是,做了另外一個(gè)測(cè)試,不去開啟線程,讓app空跑,發(fā)現(xiàn)沒(méi)有任何問(wèn)題,能夠持續(xù)的運(yùn)行七天以上。

開啟線程的代碼如下

clipboard.png

數(shù)據(jù)處理部分的代碼如下`try{

                    Bean bean = new Bean();
                    String[] res = ((String) msg.obj).split(" ");
                    if (res.length == 8) {
                        int a1 = Integer.parseInt(res[1], 16);
                        for (int i = 0; i < Constants.sensorSetBeans.size(); i++) {
                            if (a1 >= Constants.sensorSetBeans.get(i).getMin() && a1 <= Constants.sensorSetBeans.get(i).getMax()) {
                                if (a1 < 10) {
                                    bean.setSensorId("00" + a1);
                                } else if (a1 < 100) {
                                    bean.setSensorId("0" + a1);
                                } else {
                                    bean.setSensorId(a1 + "");
                                }
                                bean.setDeviceId(Integer.toString(Integer.parseInt(res[0], 16)));
                                String s1 = res[2] + res[3];
                                String s2 = res[4] + res[5];
                                int a = Integer.parseInt(s1, 16);
                                int b = Integer.parseInt(s2, 16);
                                int c = Integer.parseInt(res[6], 16);
                                Date curDate = new Date(System.currentTimeMillis());
                                bean.setRightTime(formatter.format(curDate));
                                Double temp = Double.parseDouble(a + "") * 175.72 / 65536 - 46.85;
                                Double humidity = Double.parseDouble(b + "") * 125 / 65536 - 6;
                                Double v = (Double.parseDouble(c + "") + 200) / 100;
                                if (v < 3) {
                                    lowBatMap.put(bean.getSensorId(), "");
                                    String s = "";
                                    for (Map.Entry<String, Object> entry : lowBatMap.entrySet()) {
                                        if (s.equals("")) {
                                            s = entry.getKey();
                                        } else {
                                            s = s + "," + entry.getKey();
                                        }
                                    }
                                    tvDanger3.setText(s);
                                }
                                bean.setHumility(String.format("%.2f", humidity));
                                bean.setTemp(String.format("%.2f", temp));
                                bean.setBat(String.format("%.2f", v));
                                bean.setSignal(Integer.parseInt(res[7], 16) + "");
                                Constants.map.put(bean.getSensorId(), bean);

                                if (Constants.templateMap.get(bean.getSensorId()) != null && !"".equals(Constants.templateMap.get(bean.getSensorId()))) {
                                    TemplateBean templateBean = gson.fromJson(TemplateDb.getInstance(ReceiveModuleAct.this).selectAll().get(Integer.parseInt(Constants.templateMap.get(bean.getSensorId()))), new TypeToken<TemplateBean>() {
                                    }.getType());
                                    double max = templateBean.getTop();
                                    double min = templateBean.getDown();
                                    if (temp < min) {
                                        bean.setState("0");
                                    } else if (temp > max) {
                                        bean.setState("2");
                                    } else {
                                        bean.setState("1");
                                    }
                                }
                                Iterator<String> iter = Constants.map.keySet().iterator();
                                Constants.keyList.clear();
                                while (iter.hasNext())
                                if (!tagb) {
                                    sensorAdapter.refresh(Constants.keyList);
                                } else {
                                    sensorAdapter.refresh(showList);
                                }
                                break;
                            }
                        }

                    }
                }catch (Exception e){

                }`
                
            

數(shù)據(jù)處理部分的功能主要是把接收到的數(shù)據(jù)處理好,并且刷新到頁(yè)面上,app的界面如圖
圖片描述

想請(qǐng)教下為什么app無(wú)法長(zhǎng)時(shí)間運(yùn)行,問(wèn)題是由哪一部分的功能模塊導(dǎo)致的。

回答
編輯回答
假灑脫

各位大神,求指導(dǎo)啊

2018年5月12日 13:14