【问题标题】:Run on UI thread from another class在另一个类的 UI 线程上运行
【发布时间】:2016-05-16 09:30:40
【问题描述】:

我搜索了一个解决方案,但找不到,所以我会在这里问:

我正在尝试在 mainActivity 中使用 setText 命令,直到现在我已经使用过:

 MainActivity.this.runOnUiThread(new Runnable() {
                 public void run() {
                     textViewPrograss.setText(finalI + "");
                 }
             });

现在我正在尝试做同样的事情,但是来自另一个班级,所以我不能使用:MainActivity.this。

我试图使用我在另一个问题上找到的代码但没有成功,这是代码:

new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
    Log.d("UI thread", "I am the UI thread");
}});

有什么建议吗?

【问题讨论】:

  • 您是否正在更改其他主线程中的文本?
  • 你可以在你的类中保留 MainActivity 的引用。通过这个引用你可以调用 runOnUiThread 方法
  • 一个handler默认post消息到创建它的线程,所以你需要在主线程中创建Handler类对象,然后使用handlerObject.post方法。
  • 更好的界面创建方式

标签: java android android-studio


【解决方案1】:

你可以用这个sn-p

textView.post(new Runnable() {
        @Override
        public void run() {
            textView.setText("Text");
        }
});

【讨论】:

    【解决方案2】:

    这(您问题中的第二个代码示例)是从随机位置访问 UI 线程的正确方法,尽管您应该始终尝试使用 Context 来执行此操作:-)

    new Handler(Looper.getMainLooper()).post(
        new Runnable() {
            @Override
            public void run() {
                Log.d("UI thread", "I am the UI thread");
        }});
    

    它确实有效,如果没有,请检查您是否在调试器中启用了调试日志^^

    【讨论】:

      【解决方案3】:

      试试这个只是将上下文传递给其他类,然后像这样使用它

      ((Activity)context).runOnUiThread(new Runnable() {
                       public void run() {
                           textViewPrograss.setText(finalI + "");
                       }
                   });
      

      【讨论】:

        【解决方案4】:

        我建议你在 MainActivity 中使用BroadcastReceiver。注册一个具有特定操作的新接收器,并从“另一个类”发送一个带有该操作的Intent。 MainActivity 将收到通知并可以以干净的方式编辑 TextView 内容

        主活动:

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        
            mReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    // update your text view
                    String text = intent.getStringExtra("text");
                }
            };
            registerReceiver(mReceiver, new IntentFilter(MY_ACTION));
        }
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(mReceiver);
        }
        

        另一个类:

        Intent intent = new Intent(MY_ACTION);
        intent.putExtra("text", "Your wonderful text");
        // take a context reference (e.g. mContext) if you don't have a getContext() method
        getContext().sendBroadcast(intent);
        

        【讨论】:

          【解决方案5】:

          这是我的解决方案(使用 MVVM,因此活动中没有业务逻辑),在你的类中运行它(在我的例子中是 viewmodel):

          runOnUiThread(() -> methodToExecute());
          

          这是方法实现(我的基本视图模型中有这个):

          private Handler messageHandler;
          protected void runOnUiThread(Runnable action) {
              messageHandler.post(action);
          }
          

          别忘了初始化messageHandler:

          messageHandler = new Handler(Looper.getMainLooper());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-26
            • 1970-01-01
            • 2020-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-04
            相关资源
            最近更新 更多