java - Android:处理程序中的 SetText 不会更改 TextView 中的文本
问题描述
我有一个连接到蓝牙并显示收到的信息的应用程序。当按下时,活动不会被杀死,我可以回到活动,一切都是一样的。该活动在后台收集数据,一切都很好我有一个按钮,按下时会杀死所有活动(包括显示数据的活动)。当我尝试再次创建该活动时,数据不断涌现,我仍然可以处理它并将其写入文件,但它不会在 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
:private void showData(String s) { // todo: 1.parse the 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
}
}
我什至确保runOnUiThread
我在 UI 线程上运行 setText,即使它在findViewByID
没有textviews_set
它不会发生
值得一提的是,当我第一次创建活动时,蓝牙设备没有连接,因此处理程序没有运行,所以问题很可能就在那里。我只是不知道到底在哪里,或者如何解决它。
解决方案
如果有人遇到同样的问题,我发现了问题所在。我将所有文本视图声明为非静态的,因此在第二次创建活动时,由于某种原因,处理程序仍然引用了活动第一个实例的文本视图。我所要做的就是将类中的文本视图声明为static
,因此当我第二次创建活动时,文本视图已经被声明并引用了 xml 中的实际文本视图。
推荐阅读
- visual-studio-code - 无法导入 'azure.functions' pylint(import-error) [3,1] 和无法导入 '__app__modules.library_finder' pylint(import-error) [4,1]
- java - How can I reset the timer in a ViewFlipper back to 0
- python - Programming in Python, tab completion in spacemacs not right
- javascript - 如何在 Vue.js 中循环打印 JSON 数据
- powershell - Powershell get SQL instance
- ableton-live - 如何在 Ableton 上录制 Best Service Engine Celtic Era?到目前为止没有任何效果
- asp.net-core - C# Blazor:如何在 Code behind 中使用动态 @typeparam?
- python - Sort a list of dictionary with order of specific key
- javascript - NestJS CLI 项目在终端上运行错误
- apache-spark - Remove the outer struct column in spark dataframe