передать функцию Android, которая использует параметр - PullRequest
1 голос
/ 01 ноября 2011

Я использовал Callable, но теперь мне нужна функция для использования параметра в методе call. Я понял, что это не call, так как я могу это сделать?

То, что у меня сейчас есть (неправильно):

AsyncTask async = new MyAsyncTask();
async.finished(new Callable(param) {
    // the function called during async.onPostExecute;
    doSomething(param);
});
async.execute(url);

MyAsyncTask:

...
@Override
protected void onPostExecute(JSONObject result)  {
    //super.onPostExecute(result);
    if(result != null) {
        try {
            this._finished.call(result); // not valid because call accepts no params
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public void finished(Callable<Void> func) {
    this._finished = func;
}
...

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Если вы сделаете param окончательной переменной, вы можете просто обратиться к ней из Callable:

final String param = ...;
async.finished(new Callable() {
    // the function called during async.onPostExecute;
    doSomething(param);
});

Это необходимо сделать, когда вы создадите Callable, хотя - вы не можете дать ему значение позже.Если вам это нужно по какой-то причине, вам придется использовать общее состояние - некоторый «держатель», к которому у Callable есть доступ, и который может иметь значение, установленное в нем до выполнения Callable.Вероятно, это может быть просто MyAsyncTask:

final MyAsyncTask async = new MyAsyncTask();
async.finished(new Callable() {
    // the function called during async.onPostExecute;
    doSomething(async.getResult());
});
async.execute(url);

Тогда:

private JSONObject result;
public JSONObject getResult() {
    return result;
}

@Override
protected void onPostExecute(JSONObject result)  {
    this.result = result;
    if(result != null) {
        try {
            this._finished.call();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
0 голосов
/ 28 августа 2013

Я создал новый класс, как этот

import java.util.concurrent.Callable;

public abstract class ParamCallable<T> implements Callable<T> {
    public String Member; // you can add what you want here, ints, bools, etc.
}

Тогда все, что вам нужно сделать, это

ParamCallable<YourType> func = new ParamCallable<YourType>() {
    public YourType call() {
        // Do stuff.
        // Reference Member or whatever other members that you added here.
        return YourType;
    }
}

и затем, когда вы звоните, просто установите ваши данные и позвоните call ()

func.Member = value;
func.call();
...