我的移动编程模块的课程设置有些问题。
基本上我扩展了Asynctask
,它执行一个php脚本,根据输入访问我的MYSQL
数据库。现在执行的一个函数需要我将数据从脚本返回到另一个类。班级顺序如此:
MainClass -> HelperClass -> NetworkClass(AsyncTask)
MainClass
执行HelperClass
函数'QueryDatabase',然后创建php脚本所需的数据,然后将此数据传递给NetworkClass。
NetworkClass
然后执行数据库查询并存储接收的数据(public var)
HelperClass
然后从NetworkClass
中提取数据。
MainClass
然后从HelperClass
中提取数据,然后对其进行处理。
目前这是我能想到的最佳方式,因为我希望保持NetworkClass
动态。但问题是MainClass
在尝试提取数据之前不会等待NetworkClass
完全执行,因此处理无法完成。
这是最好的方法吗?我可以在执行MainClass
中的数据库查询和提取数据之间放一些延迟吗?
希望这是有道理的。
不太确定要发布什么代码,因为我有很多。对不起。
答案 0 :(得分:2)
不,永远不要使用一些随机延迟来假设请求完成所需的时间。
您应该做的是实现一个接口,该接口用作异步任务的oncomplete的回调。您需要知道返回的时间和内容,然后将接口对象传递给在oncomplete方法中调用的asynctask。
另外需要考虑的一点是,如果可能需要密集,您可能希望让数据库在后台线程上运行。
这可能是什么样的
class EZAsyncTask extends AsyncTask<Void, Void, String>
{
private AsyncTaskListener listener;
public EZAsyncTask(AsyncTaskListener listener)
{
super();
this.listener = listener;
}
@Override
protected String doInBackground(Void... params)
{
//somethign to do
return null;
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
listener.onCompletion(result);
}
public interface AsyncTaskListener
{
public void onCompletion(String result);
}
}
您的活动中的用法或基于每次使用的任何内容
EZAsyncTask ezTask = new EZAsyncTask(new AsyncTaskListener() {
@Override
public void onCompletion(String result)
{
// TODO handle response
}
});
ezTask.execute();
或者你可以让你的类/活动实现它,就像你可以让你的活动实现一个OnClickListener
另一种可以做到这一点的方法是使用Handler,还有其他模式可以做。但我更喜欢这样做。简单,快速,干净。
答案 1 :(得分:0)
你的MainClass中有一段代码来提取结果,它应该是异步的。让它对结果进行主动等待是没有意义的,因为它会停止执行它的线程。
这是我经常关注的部分:
private class NetworkAsyncTask extends AsyncTask<Foo, Void, Bar> {
@Override
protected Bar doInBackground(Foo... foos) {
// Use the "foos" to fetch a "bar" from your network.
}
@Override
protected void onPostExecute(Bar bar) {
// Put here your result handling code,
// don't leave it in the waiting state on the thread used in your MainClass.
}
}