繁体   English   中英

从非活动类的异步任务获取结果

[英]get result from async task in not activity class

我使用异步任务从数据库中获取数据。 我有 :

public class BackgroundDatabaseTask extends AsyncTask<String, Void, String> {
    String jsonData;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... values) {
        String jsonData = Driver.returnJsonDataFromDatabase(values[0]);
        return jsonData;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result) {
        jsonData = result;
    }
}

在其他课程中,我将其用作:

private static String returnJsonDataBackgroundTaskExecute(String fromWhichTableGetData) {

    try {
        return new BackgroundDatabaseTask().execute(fromWhichTableGetData).get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

    return "Error in BackgroundDatabaseTask";
}

但是get()阻塞了我的主线程。 那么,如何在其他非活动类中获得异步任务的结果? 我想在非活动类中运行此类,因此我的类没有onCreate方法,但是我的MainActivity类具有活动。

更新:现在我使用线程解决了这个问题,但这是一个很好的解决方案?

Runnable runnable = new Runnable() {
        @Override
        public void run() {
            listOfDataFromDatabase = GetterDataFromDatabase.returnJsonDataBackgroundTaskExecute(tableNameFromWhichIGetData);
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

现在我可以通过其他方法访问这个可变的listOfDataFromDatabase

AsyncTask创建一个新线程来执行需要很长时间的任务。 您可以通过调用execute()启动此线程。 但是,您立即调用get() ,它等待任务完成。 首先,这完全破坏了使用AsyncTask的整个目的。

相反,您应该删除对get()的调用,并在onPostExecute()进行最后处理。 您可以使用此方法做任何您想做的事情。 绝对不要求您以任何方式使用活动。 您可以根据需要将数据提供给其他类。

您可以在Asynctask类中定义一个接口,然后在任何需要的地方实现它,并从该接口回调中获取结果。

MyTask extends AsynTask{
public interface DataListener{
void onDataReceived(String result);
}
/// then on your onPostExecute method , get an instance of the interface then push the result to the interface method 
dataListener.onDataReceived(result);
}

也许这会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM