Java回调函数作为参数

时间:2014-11-07 09:54:46

标签: java callback inline

我想做一些简单的事情,但我无法在Google搜索中表达。所以,我来这里^^

我有这样的异步任务:

class RequestTask extends AsyncTask<String, String, String> {

    final MyCallbackInterface callback;

    RequestTask(MyCallbackInterface callback) {
        this.callback = callback;
    }

    @Override
    protected String doInBackground(String... uri) {
        ...
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        callback.onTaskFinished(result);
    }
}

interface MyCallbackInterface {
    void onTaskFinished(String result);
}

所以,我有一个任务,在任务结束时执行回调。

现在我可以这样称呼它:

class Program {

    public void DoAsyncRequest(String stringUrl, MyCallbackInterface callback) {
        new RequestTask(callback).execute(stringUrl);
    }

    public static void Main(){

        DoAsyncRequest("http://toto.com", new MyCallbackInterface() {

            @Override
            public void onDownloadFinished(String result) {
                //do something ...
            }
        });
    }
}

但是,不要使用&#34;内联&#34;作为回调函数,是否可以做这样的事情:(如果是,怎么做?)

class Program {

    public void DoAsyncRequest(String stringUrl, MyCallbackInterface callback) {
        new RequestTask(callback).execute(stringUrl);
    }

    public static void Main(){

         DoAsyncRequest("http://toto.com", MyCallBack);
    }

    private void MyCallBack(string result){
        //do something
    }
}

谢谢!

2 个答案:

答案 0 :(得分:0)

创建一个静态类:

private static class MyCallback implements MyCallbackInterface  {

        @Override
        public void onDownloadFinished(String result) {
            //do something ...
        }
}

然后使用

进行呼叫
DoAsyncRequest("http://toto.com", new MyCallBack());

你无法做到

private void MyCallBack(string result){
    //do something
}

因为您的回调应该是对象类型之一而不是方法。它也不是内联方法,它是我们调用的匿名类,它与上面定义的类非常相似,除了它没有任何名称,但你通过覆盖实现该方法。

答案 1 :(得分:0)

您可以将回调方法创建为静态,然后使用反射来调用它。您在该解决方案中遗漏的主要内容是类型安全;您可以将要在任务完成时调用的类作为MyClass.class传递。