【问题标题】:Android Redirection (delegates pointers)Android 重定向(委托指针)
【发布时间】:2017-08-09 15:39:59
【问题描述】:

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

【问题讨论】:

  • Android 中的BackgroundTask 称为AsyncTask。从这里开始:developer.android.com/reference/android/os/AsyncTask.html.
  • 我想你误解了我的问题。
  • “处理程序可以在后台线程上运行代码吗?”。不,你应该使用 AsyncTask 来代替
  • 这绝对不是解决方案,但谢谢。
  • 我的不是答案,只是提示(评论)。

标签: java android


【解决方案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 对象,添加一个侦听器,并在需要触发您的事件时通知它们。

【讨论】:

    【解决方案2】:

    如果我对你的理解正确,你不能在 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();
    })
    

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2015-07-15
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多