2014-11-07 3 views
1

Я хотел бы сделать что-то простое, но я не могу выразить это в поиске Google. Итак, я пришел сюда ^^Функция обратного вызова Java как параметр

У меня есть Async задача так:

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 ... 
      } 
     }); 
    } 
} 

Но, вместо того, чтобы функция «встроенной» в качестве обратного вызова, можно сделать что-то вроде этого: (если да, то как?)

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 
    } 
} 

Спасибо!

ответ

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 
} 

, как ваш обратный вызов, как ожидается, будет один из объекта типа, а не метода. Кроме того, это не встроенный метод, это анонимный класс, который мы вызываем и который очень похож на класс, определенный выше, за исключением того, что у него нет имени, но вы реализуете метод путем переопределения.

0

Вы можете создать свой метод обратного вызова как статический, а затем использовать отражение для его вызова. Главное, что вы пропустили в этом решении, - это безопасность типа; Затем вы можете передать класс, который будет вызываться при завершении задачи, как MyClass.class.