Android - 多功能Asynctask返回数据

时间:2014-04-21 03:46:31

标签: java android

我的移动编程模块的课程设置有些问题。

基本上我扩展了Asynctask,它执行一个php脚本,根据输入访问我的MYSQL数据库。现在执行的一个函数需要我将数据从脚本返回到另一个类。班级顺序如此:

MainClass -> HelperClass -> NetworkClass(AsyncTask)

MainClass执行HelperClass函数'QueryDatabase',然后创建php脚本所需的数据,然后将此数据传递给NetworkClass。

NetworkClass然后执行数据库查询并存储接收的数据(public var) HelperClass然后从NetworkClass中提取数据。 MainClass然后从HelperClass中提取数据,然后对其进行处理。

目前这是我能想到的最佳方式,因为我希望保持NetworkClass动态。但问题是MainClass在尝试提取数据之前不会等待NetworkClass完全执行,因此处理无法完成。

这是最好的方法吗?我可以在执行MainClass中的数据库查询和提取数据之间放一些延迟吗?

希望这是有道理的。

不太确定要发布什么代码,因为我有很多。对不起。

2 个答案:

答案 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.
  }
}