我正在整理我的第一个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传递回我的活动?或者我完全咆哮错误的树 - 我应该追求一些更好的方法吗?
答案 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);
}
}