android - 如何在 Android 中实现 "fire-and-forget"异步调用?

标签 android multithreading asynchronous

我正在审查/清理一些 Android 代码。该代码使用此模式执行了一些“异步”网络和数据操作:

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

很多。伴随着所有丑陋的后果(没有错误检查、 sleep 、 bool finish 变量...)。

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

现在我偶然发现了一些“即发即弃”的网络通信:代码(目前,线程,一如既往)调用网络服务发布一些数据。 我不需要知道是否接收到数据,也不需要知道是否有任何错误。

哪种方法最好? RunnableAsyncTask(静态嵌套类,所以我不会“泄露”对“此” Activity 的引用?)

或者有更好的东西(更“轻量级”和更清洁?)

最佳答案

如果您不需要知道任务执行何时完成,那么您绝对不需要 AsyncTask。因此,最轻量级的解决方案就是一个Thread。您可以使用 Executor 来为您创建线程。要摆脱嵌套类,您可以预定义任务。示例:

预定义任务:

public static class TaskA implements Runnable{

    private int someParam;

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

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

静态执行器

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 根!因此,如果您将 Activity 或位图等重对象传递到任务中,则可能会导致内存泄漏。

关于android - 如何在 Android 中实现 "fire-and-forget"异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24550380/

相关文章:

javascript - 使用 setTimeout() 时重写异步/等待的 promise

c# - 使用不等待的异步

写入文件时 Android 权限被拒绝

java - 在java中使用线程绘制面板

c++ - 具有模板化类成员函数的多线程

c# - 像在 c# 中一样将整个类作为参数传递给线程 c++

ios - swift realm 在后台线程中插入数组在main中使用

android - 对于OkHttp,SSLSocketFactory是否先使用SocketFactory?

java - RxJava 错误处理

android - 使用 Intent.ACTION_PICK 打开图像