Java (Android): вызов функции из контекста без приведения - PullRequest
0 голосов
/ 03 декабря 2011

Прежде всего - я довольно новичок в Java, поэтому, если вопрос не имеет смысла, дайте мне знать.

В основном я делаю приложение для Android, которое взаимодействует с моим веб-сервисом, и поэтому я создал отдельный класс для взаимодействия с ним, который также включает AsyncTask (я многое удалил из кода здесь только для предварительный просмотр):

public class api {

private String caller = null;
Context that = null;

api(Context that) {

    this.that = that;
    this.caller = that.getClass().getSimpleName();

}

void call(String action) {

    /* .... */

    }

    new back().execute(param1, param2);

}

void callback(String action, String result){

    that.callback(action, result);

}



public class back extends AsyncTask<String, Void, String> {

    public String response = null;

    protected String doInBackground(String... params) {

        response = connection.executeRequest(params[1]);
        return response;

    }

    protected void onPostExecute(String result) {

        callback("a", "b");                 

    }

}    


}

И когда я использую класс из какой-то части приложения (скажем, SomeClass.class), я делаю:

api WS = new api(this);
WS.call("....");

И он должен выполнять функцию callback, которая есть в SomeClass. Но ключевая проблема здесь заключается в следующем:

that.callback(action, result);

Eclipse заставляет меня добавить имя класса "вызывающего" в актерском составе:

(SomeClass) that.callback(action, result);

Но это не работает для меня, потому что я использую класс api из множества разных классов, поэтому в идеале мне нужно поместить переменную в приведение. Я получаю название класса "вызывающего" здесь:

this.caller = that.getClass().getSimpleName();
//obviously this won't work:
(this.caller) that.callback(action, result);

Есть ли что-нибудь, чтобы сделать это, или я делаю что-то в корне неправильно?

Спасибо.

1 Ответ

1 голос
/ 03 декабря 2011

В настоящее время ваш класс API принимает объект Context в своем конструкторе по умолчанию.Было бы более целесообразно расширить Context новым классом, который содержит метод обратного вызова, который затем можно переопределить в подклассах, таких как SomeClass, что сведет на нет необходимость приведения в вашем классе API.например:

public class APIContext extends Context
{
    public void callback( String action, String result )
    {
        /* ... */
    }
}

public class SomeClass extends APIContext
{
    @Override
    public void callback( String action, String result )
    {
        /* ... */
    }
}

public class api
{
    private APIContext callerContext = null;

    public api( APIContext context )
    {
        this.callerContext = context;
    }

    public void callback( String action, String result )
    {
        callerContext.callback( action, result );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...