如何在Android中实现“即发即弃”的异步调用?

时间:2014-07-03 09:49:23

标签: android multithreading asynchronous

我正在审核/清理一些Android代码。代码做了一些"异步"使用这种模式的网络和数据操作:

new Thread() { public void run() { { ... runOnUiThread( { .. } ) }

很多。带来所有丑陋的后果(没有错误检查,Sleeps,布尔finish变量......)。

直到现在,我最终使用(少数)AsyncTasks和(更多)Loaders作为替代品。

现在我偶然发现了几个“即使忘掉”的故事。网络通信:代码(当前,一如既往的线程)调用发布一些数据的Web服务。 我不需要知道数据是否已收到,我不需要知道是否有任何错误。

这是最好的方法吗?一个RunnableAsyncTask(静态嵌套类,所以我没有"泄漏"对&#34的引用;这"活动?)

还是有更好的东西(更多"轻量级"更清洁?)

1 个答案:

答案 0 :(得分:5)

如果您不需要知道任务执行何时完成,那么您根本不需要AsyncTask。因此,最轻量级的解决方案只是Thread。您可以使用Executor为您创建线程。要摆脱嵌套类,您可以预先定义任务。样品:

预定义任务:

public static class TaskA implements Runnable{

    private int someParam;

    public TaskA(int someParam) {
        this.someParam = someParam;
    }

    @Override
    public void run() {
        //
    }
}

静态Executor

public static class FireAndForgetExecutor{

    private static Executor executor = Executors.newFixedThreadPool(5);

    public static void exec(Runnable command){
        executor.execute(command);
    }
}

用法:

FireAndForgetExecutor.exec(new TaskA(10));

PS 请勿忘记Thread已连接到GC根目录!因此,如果将诸如活动或位图之类的重对象传递给任务,则可能导致内存泄漏。