从函数库中的Async回调

时间:2012-01-30 21:38:22

标签: java android android-asynctask

我正在整理我的第一个Android应用程序,这也是我对Java编程语言的介绍,所以我绊倒了可能是一些非常基本的概念。

我的计划是设置一个充满php函数的服务器,并将所有php调用放在一个静态函数库中。如果它简化了这个问题,我可以将静态类更改为单例。

在活动中,我拨打以下电话:

phpCalls.VerifyAccount(userName, password);

在phpCalls静态类中,我得到了以下代码:

    PHP_AsyncTask validateAccountTask = new PHP_AsyncTask();
    validateAccountTask.execute(new String[] {DOMAIN + PHP_confirm_account_exists, username, password});

private static class PHP_AsyncTask extends AsyncTask<String, Void, String>{
    //This class should take the full URL of the php function to call and return the string result. Somehow.
    @Override
    protected String doInBackground(String... args)
    {
        String response = "";

        try
        {
            String url = args[0];
            String username = args[1];
            String password = args[2];
            URL validateURL = new URL(url);
            String credentials = "Basic " + new String(Base64.encode((username + ":" + password).getBytes(), Base64.NO_WRAP)) ;

            //TODO: handle 501 result
            HttpURLConnection conn = (HttpURLConnection)validateURL.openConnection();
            conn.setDoOutput(true);
            conn.setRequestProperty("Authorization",credentials);

            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;

            while ((line = reader.readLine()) != null)
            {
                response += line;
            }
            reader.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }

        return response;
    }


    @Override
    protected void onPostExecute(String result)
    {
        //have something happen when the php returns - need to pass the result somewhere
    }

很抱歉,如果代码格式不够理想 - 我不是Stackoverflow上的常规海报。

无论如何,我试图确定如何最好地处理来自php调用的结果 - 它被返回到PHP_AsyncTask类的onPostExecute函数作为结果,但我需要以某种方式将其传回到UI线程。显然,我无法在活动中创建指向函数的指针,并将其传递给异步类。有没有办法在我的活动中创建一个监听器并传递它,以便我可以将结果从PHP_AsyncTask传递回我的活动?或者我完全咆哮错误的树 - 我应该追求一些更好的方法吗?

2 个答案:

答案 0 :(得分:2)

1)UI线程中的onPostExecute

2)您可以将指针传递给接口,而不是指向函数的指针。例如,如果您有这样的界面

public interface Listener{
    public void someFunc(String response);
}

您可以将任何实现该接口的类作为参数传递。例如,如果您的方法是

public void sendRequest(Listener listener);

你可以作为listener你的班级传递:

public class SomeClass implements Listener{
    public void someFunc(String response){
        //do stuff
    }
}
像那样

sendRequest(new SomeClass());

PS 我在答案中没有使用AsyncTask,但我希望你能得到这个想法

答案 1 :(得分:0)

所以我现在无论如何都要测试它,但这就是我要做的。

为侦听器创建接口

public interface MyListener {
    public void onDone(String response);
}

从活动中调用VerifyAccount,如此

phpCalls.VerifyAccount(userName,password, new MyListener() {
    @Override
    public void onDone(String response) {
        //do stuff
    }
});

然后更改PHP_AsyncTask的构造函数以接受一个参数,即您创建的接口。更改VerifyAccount的方法签名以获取其他参数并将其传递给您创建的新PHP_AsyncTask。

private static class PHP_AsyncTask extends AsyncTask<String, Void, String>{ 
    private MyListener listener;
    public PHP_AsyncTask (MyListener listener) {
        this.listener = listener;
    }

   .....

   @Override
   protected void onPostExecute(String result)
   {
      listener.onDone(result);
   }
}