Java(Android):从Context调用函数而不进行强制转换

时间:2011-12-02 23:41:22

标签: java android class android-asynctask

首先 - 我是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("....");

它应该执行SomeClass中的函数'callback'。 但这里的关键问题是这一行:

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 个答案:

答案 0 :(得分:1)

目前,您的api类在其默认构造函数中接受Context对象。使用包含回调方法的新类扩展Context会更有意义,然后可以在子类(例如SomeClass)中覆盖它,这将取消在api类中进行强制转换的需要。 e.g:

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