我想从后台线程循环中调用不同的代码(回调(,并使用该后台线程来执行工作。它类似于 C# 中的委托。
public class test {
private boolean keepRunning;
private boolean messageReady;
private MyClass myClass;
void LongBackgroundWork(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (keepRunning) {
if (messageReady){
myClass.callback(); // call different methods here
// to be decided at runtime and run on this worker thread
}
}
}
});
thread.start();
}
}
我想使用后台线程而不是 UI 线程。我想从 myClass 中设置一个回调来选择调用的代码。在C#中,如何做Java很容易。 我在Java方面没有太多经验,也不明白使用什么机制。我应该使用处理程序吗?处理程序是否可以在后台线程上运行代码?
我敢打赌,你想要一个发生事件或某些事件的模式,你需要在某处启动一个代码块。
可以帮助您的模式可能是观察者维基并启动事件。如果您愿意,也可以在此处查看此SO问题:Java中的委托与回调
就您而言,我认为您希望有人处理消息准备就绪时您必须做的事情的责任。因此,您正在寻找的是一旦事件被读取(消息准备就绪(来执行操作的人。
例如,ClassFoo是您的侦听器容器,或者也称为观察者,它将收到任何事件的通知。您可以在此处列出对某个对象的回调列表,该对象负责您的逻辑执行下一步需要执行的操作。
然后,您将拥有一个可观察对象或类,该对象或类将在收到通知时实现某些逻辑。然后,您可以通过实现所需的回调函数让各种类对象执行必要的逻辑。
例:
// Observer
public class Foo {
// List of objects that implement Callbacks interface
private List<Callbacks> mList;
public Foo() {
// Initialize here
}
public void addListener(Callbacks cb) {
mList.add(cb);
}
public void notifyListeners() {
for ( Callback cb : mList) {
cb.onCallback();
}
}
// Public interface to be implemented by users
public interface Callback {
void onCallback();
}
}
然后,只需让一个类实现此对象,如果您愿意,可以传递它。
// Bar implements Foo.Callback interface
public class Bar implements Foo.Callback {
public class Bar() {}
@Override
public void onCallback() {
// Perform logic here
}
}
最后,在代码中,您只需创建 Foo 对象,添加一个侦听器,并在需要触发事件时通知他们。
如果我理解正确,你不能在 UI 线程上执行此操作,基本上当 android 看到这样的线程时,它会期望它是一个很长的操作,但是你可以通过 AsyncTask 或处理程序调用它
你可以做这样的东西
private class MyAsyncTask extends AsyncTask<Void,Void,Void>{
protected Void doInBackground() {
MyClass myClass=new MyClass();
myClass.LongBackgroundWork();
}
return totalSize;
}
}
这就是 yo 调用您的线程的方式,否则您必须使用 Handler 代替
Handler handler=new Handler();
handler.post(new Runnable(){
MyClass myClass=new MyClass();
myClass.LongBackgroundWork();
})