我想从后台线程循环中调用不同的代码(回调),并使用该后台线程来执行工作。它与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 diffrent methods here
// to be decided at runtime and run on this worker thread
}
}
}
});
thread.start();
}
}
我想使用后台线程而不是UI thead。我想在myClass中设置一个回调来选择调用的代码。在c#中如何做到这一点很简单。 我没有太多java经验,也不了解使用什么机制。我应该使用处理程序吗?处理程序可以在后台线程上运行代码吗?
答案 0 :(得分:1)
我打赌你想要一个事件或某些事件发生的模式,你需要在某个地方启动一个代码块。
可以帮助你的模式可能是一个观察者 Wiki并开始对事件发起攻击。如果您愿意,也可以在此处查看此SO问题:Delegate vs Callback in Java
在您的情况下,我认为您希望让某人处理您在准备好消息时必须执行的操作的责任。因此,一旦事件被读取(消息准备好),您正在寻找的是执行操作的人。
以示例类 Foo 是您的侦听器容器,或者也称为 Observer ,它将被通知任何事件。您可以在此处获得一个回调列表,其中包含一个对象,该对象负责您的逻辑以执行下一步所需的操作。
然后你会有一个 Observable 对象或一个在通知时会实现某些逻辑的类。然后,您可以通过实现所需的回调函数,让各种类对象执行必要的逻辑。
示例:
// 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对象,添加一个侦听器,并在触发事件时通知它们。
答案 1 :(得分:0)
如果我理解正确,你就无法在UI线程上执行此操作,基本上当android看到这样的线程时,它会期望它是一个很长的操作但是你可以通过AsyncTask或Handler来调用它
你可以做这样的事情
private class MyAsyncTask extends AsyncTask<Void,Void,Void>{
protected Void doInBackground() {
MyClass myClass=new MyClass();
myClass.LongBackgroundWork();
}
return totalSize;
}
}
这就是你如何调用你的线程,否则你必须使用Handler
Handler handler=new Handler();
handler.post(new Runnable(){
MyClass myClass=new MyClass();
myClass.LongBackgroundWork();
})