【问题标题】:Android: SetText in handler doesn't change text in TextViewAndroid:处理程序中的 SetText 不会更改 TextView 中的文本
【发布时间】: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


【解决方案1】:

如果有人遇到同样的问题,我发现了问题所在。 我将所有文本视图声明为非静态的,因此在第二次创建活动时,由于某种原因,处理程序仍然引用了活动第一个实例的文本视图。 我所要做的就是将类中的文本视图声明为static,所以当我第二次创建活动时,文本视图已经被声明并引用了xml中的实际文本视图。

【讨论】:

    【解决方案2】:

    根据提供的信息,以下是最佳建议。

    所以在onCreate()textviews_set=true;之前尝试以下操作

       gsrTextView.setText(" ");
       emgTextView.setText(" "); 
       adxlTextView.setText(" "); 
       fsrTextView.setText(" "); 
    

    希望这能解决问题。

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2019-04-13
      相关资源
      最近更新 更多