Android重定向(指向指针)

时间:2017-08-09 15:39:59

标签: java android

我想从后台线程循环中调用不同的代码(回调),并使用该后台线程来执行工作。它与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经验,也不了解使用什么机制。我应该使用处理程序吗?处理程序可以在后台线程上运行代码吗?

2 个答案:

答案 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();
})