我有MainActivity
和我的单独课程,名称是MyClass
。我想在MyClass
中运行一些代码。我在MyClass
中有相应的方法。在MyClass
的构造函数中,我传递了Context
类的MainActivity
并将Context
转换为Activity
。
MyClass.java
private Context context;
private Activity activity;
public MyClass(Context context) {
this.context = context;
this.activity = (Activity) context;
}
public void MyFunction() {
activity.runOnUiThread(new Runnable() {
public void run() {
// Code
}
});
}
这里的一切都很顺利。在runOnUiThread
中,我编写了一些代码。有一种情况,执行runOnUiThread()
正文后,我想回到MyClass上下文。我希望这只能在runOnUiThread()
中完成。有没有办法再次切换回当前线程?
由于
答案 0 :(得分:2)
您可以使用ρяσѕρєяK或Kushal发布的答案之一。这是我的2美分,让事情变得清晰。
runOnUiThread
内的所有代码都将在UI线程上执行,不能分为两部分;一个在UI线程上运行,另一个在不同的线程/上下文中运行。现在,如果您想在runOnUiThread
完成后执行代码块,那么您可以修改runOnUiThread
函数,如下所示(如此处的一些答案所示):
public void MyFunction() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// Add code to run on UI-Thread here
}
});
// Add code to run on non UI-Thread here (i.e. on the calling Thread)
}
答案 1 :(得分:1)
从runOnUiThread()
访问PubNub的API后,android系统会自动将处理切换到当前线程并执行外部语句:
public void MyFunction() {
activity.runOnUiThread(new Runnable() {
public void run() {
// Code which runs on MAIN UI thread
}
});
// once upper part is done, switching to current thread
// these statements will be execute on current thread
// statement 1;
// ...
}
答案 2 :(得分:1)
如果在活动类中定义并实现自定义类,除非您创建新线程,否则所有代码都将在UI线程中运行。
runOnUiThread
方法传递必要的信息,让不同的线程引用UI线程来更新视图或其他UI组件。
要在原始课程中运行代码,您应该做一些事情。首先,您应该将其定义为一个单独的类(在另一个文件中,而不是私有类)。
其次,您应该将Activity
(可能是WeakReference
)传递给它,然后使用Activity
方法" runOnUiThread"必要时。
另一种选择是创建Handler
或Thread
以便在您希望它运行时运行用户界面。
您对用例并不完全清楚......
答案 3 :(得分:1)
我从问题中得到的是你需要在UI线程中运行一些代码,在后台线程中运行一些代码。是的,您可以修改MyClass
以使用Handler
,如下所示。
private Context context;
private Handler backgroundHandler;
private Handler uiHandler;
public MyClass(Context context, Handler handler) {
this.context = context;
// this.activity = (Activity) context;
this.uiHandler = handler;
HandlerThread handlerThread = new HandlerThread("MyClass.Handler");
handlerThread.start();
backgroundHandler = new Handler(handlerThread.getLooper());
}
public void MyFunction() {
uiHandler.post(new Runnable() {
public void run() {
// Code to execute on ui thread
backgroundHandler.post(new Runnable() {
public void run() {
// Code to execute on bg thread
}
});
}
});
}
将Handler
传递给:
MyClass myClass = new MyClass(context, new Handler());