我搜索了一个解决方案但找不到一个,所以我会在这里问:
我正在尝试在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");
}});
有什么建议吗?
答案 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());