从另一个类的UI线程运行

时间:2016-05-16 09:30:41

标签: java android android-studio

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

我正在尝试在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");
}});

有什么建议吗?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

您可以使用此代码段

TObject.GetInterfaceEntry()

答案 2 :(得分:1)

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

MainActivity:

@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);

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

runOnUiThread(() -> methodToExecute());

这是方法实现(我在我的基本viewmodel中有这个):

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

不要忘记初始化messageHandler:

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