【发布时间】:2020-06-28 19:05:04
【问题描述】:
我有一个应用程序连接到蓝牙并显示收到的信息。 当按下时,活动不会被杀死,我可以回到活动,一切都是一样的。活动在后台收集数据一切正常 我有一个按钮,按下时会杀死所有活动(包括显示数据的活动)。 当我尝试再次创建该活动时,数据不断涌现,我仍然可以处理它并将其写入文件,但它不会在 UI 中显示。在第二次创建活动后,处理程序中的 setText 函数似乎不起作用(setText 确实在处理程序之外工作)。
如果第二次创建活动,布尔值synced 为真。
这是OnCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin);
loading_panel = findViewById(R.id.loadingPanel);
loading_panel.setVisibility(View.GONE);
connectionButton = (Button) findViewById(R.id.connection_button);
gsrTextView = (TextView) findViewById(R.id.gsr_textview);
emgTextView = (TextView) findViewById(R.id.emg_textview);
adxlTextView = (TextView) findViewById(R.id.adxl_textview);
fsrTextView = (TextView) findViewById(R.id.fsr_textview);
textviews_set=true;
if(synced)
{
setConnected(currMac);
manageConnection();
Button sync_button = (Button) findViewById(R.id.sync_button);
sync_button.setText(R.string.synced_text);
}
// more code
}
OnBackPressed的实现:
@Override
public void onBackPressed() {
Intent i = new Intent(AdminActivity.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
}
这是(部分)处理程序:
@SuppressLint("HandlerLeak")
public final Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
//a lot of code for other cases
case READ_SUCCESS:
String s = (String) msg.obj;
showData(s);
break;
}
}
}
这是(部分)showData:
私人无效showData(字符串s){
// todo: 1.解析json; 2.在textViews上显示数据(json组件)
try {
//Log.d(LOG_TAG, "the new string is " + s);
JSONObject json = new JSONObject(s);
// Collect the sensors measurements
String gsrMeasure = json.getString("gsr");
String emgMeasure = json.getString("emg");
String adxlMeasure = json.getString("adxl");
String fsrMeasure = json.getString("fsr");
String time_str = json.getString("time");
// Show the data
if(textviews_set) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "ABOUT TO SET TEXT");
gsrTextView.setText(gsrMeasure);
emgTextView.setText(emgMeasure);
adxlTextView.setText(adxlMeasure);
fsrTextView.setText(fsrMeasure);
}
});
}
//more code
}
}
我什至确保我在 UI 线程上运行 setText,即使它在没有 runOnUiThread 的活动的第一次运行时工作
我还认为可能在调用 findViewByIDs 之前调用了处理程序,但我使用了布尔变量 textviews_set 来确保它不会发生
值得一提的是,当我第一次创建活动时,蓝牙设备没有连接,因此处理程序没有运行,所以很有可能是问题出在在那里。我只是不知道具体在哪里,或者如何解决它。
【问题讨论】:
-
假设应用程序仅作为一项活动是否安全。无论哪种方式,在 onPause()、onStop() 和 onDestory() 活动中都会完成哪种类型的清理。
-
不,该应用程序有很多活动。我将添加
OnBackPressed的实现。除此之外,我不会覆盖 OnPause OnStop 或 OnDestroy -
你能显示
setResult()和onActivityResult的代码吗? -
我没有重写这些函数(至少不是针对那个活动)
-
是的,我发布的所有代码都来自同一个活动
标签: java android user-interface textview settext