📜  在 Android 中使用什么进行后台处理?

📅  最后修改于: 2022-05-13 01:55:22.409000             🧑  作者: Mango

在 Android 中使用什么进行后台处理?

默认情况下,应用程序代码在主线程中运行。因此,每个语句都是按顺序执行的。如果您执行持续时间较长的操作,则设备会阻塞,直到相应的操作完成。为了提供诚实的用户体验,Android 应用程序中所有可能运行缓慢的操作都应该异步运行。这将通过Java语言或 Android 框架的并发构造进行存档。潜在的慢操作例如:网络、文件和数据库访问,以及像它们这样的复杂计算和任务需要后台处理,让我们深入一点并详细了解一下!

Android 修改界面并处理来自单个线程的输入事件,称为最线程。 Android 在队列期间收集此线程期间的所有事件,并使用 Looper 类的实例处理此队列。 Android 操作系统使用 Thread 类来执行异步任务,例如上面标题图像中提到的那些。 Java.util.concurrent也由它提供来执行某些任务,我们称之为后台。 F或例如,通过使用线程池和执行器类。

如果您想从替换线程更新接口,您希望与最多的线程同步。由于这些限制,Android 开发人员通常使用 Android 特定的代码结构。

这是一个例子

RxJava 开源框架允许指定可观察知识流的观察者。一旦事件发生并报告完成,观察者就会被框架命名。您将配置观察者和可观察者在哪个线程运行。

究竟什么是背景工作?

只要满足每个后续条件,应用程序就会被考虑在后台运行:

  1. 应用程序未处于运行状态且未执行任何前台服务,而设备正在使用中。
  2. 应用程序的任何活动(页面)或片段当前都看不到使用它的人

可以从下图获取一个简单的字形来理解这个过程:



图。1

后台任务的类别

后台任务属于以下主要类别之一:

  1. 即时
  2. 延期
  3. 精确的

要对任务进行分类,请回答后续问题,并遍历(图 1:) 中的相应决策树

  • 当用户正在/正在与应用程序交互时,任务是否自行完成?是的?那么这应该归类为立即执行吗?如果没有,请继续第二个问题。
  • 任务是否在特定时间运行?如果您要在特定时间运行任务,请将任务准确分类。

大多数任务不会在特定时间运行。任务一旦运行,通常会在网络可用性和剩余电池等支持条件下留下轻微的变化。

  • 不能在特定时间运行的任务应归类为延迟。

这些任务可用于 Android 中的后台处理,让我们详细了解它们:

1. 即时任务

对于应该立即执行并希望继续处理的任务,尽管用户将设备置于后台或设备重新启动,我们建议使用 WorkManager 及其对长时间运行任务的支持。在特定情况下,例如媒体播放或主动导航,您可能希望直接使用前台服务。

2.延期任务

每个与用户交互间接相关并且可能在未来任何时间运行的任务通常推迟。延迟任务的推荐解决方案是 WorkManager。 WorkManager 使得调度异步和可延迟的任务变得非常高效和容易,甚至是手机重启时需要恢复的任务!

3. 确切的任务



必须在特定时间点执行的任务,它们可以使用 AlarmManager。

线程和处理程序

使用可运行对象初始化线程,然后继续执行任何繁重的操作。默认情况下,视图有一个处理程序,因此您将执行 View.post()。 Handler 是在创建的线程上运行的繁重任务与 UI 线程之间的通信方式。

Java
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        final String result = performBlockingTask();
        // GfG Thread Example
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mTextView.setText(result);
            }
        });
    }
});
thread.start();


Java
public class BackgroundServiceGfG extends IntentService {
   
    private static final String TAG = BackgroundServiceGfG.class.getSimpleName();
 
    public BackgroundServiceGfG() {
        super(TAG );
    }
 
    @Override
    protected void onHandleIntent(Intent intent) {
        blockingTask();
    }
}


Java
new AsyncTask() {
    @Override
    protected void onPreExecute() {
        // Creating a Sample Async Task
    }
 
    @Override
    protected String doInBackground(Void... voids) {
        return performBlockingTask();
    }
 
    @Override
    protected void onProgressUpdate(Integer... progress) {
        mProgessBar.setProgress(progress);
    }
 
    @Override
    protected void onPostExecute(String result) {
        mTextView.setText(result);
    }
    
}.execute();


问题:

  • 不支持配置更改,换句话说,如果我们的应用程序支持两种方向(横向和纵向),我们必须在用户旋转设备时处理线程和处理程序的状态。
  • 样板代码和不友好的阅读。
  • 没有错误处理程序。

意图服务

当需要在不影响 UI 的后台运行任务时很有用。它们与视图完全分离,即它们不受 Activity 生命周期的影响。



Java

public class BackgroundServiceGfG extends IntentService {
   
    private static final String TAG = BackgroundServiceGfG.class.getSimpleName();
 
    public BackgroundServiceGfG() {
        super(TAG );
    }
 
    @Override
    protected void onHandleIntent(Intent intent) {
        blockingTask();
    }
}


问题:

  • 没有与 UI 的直接通信。

异步任务

在后台运行指令并再次与大多数线程同步。对于简短的后台操作很有用。在这里阅读更多。

Java



new AsyncTask() {
    @Override
    protected void onPreExecute() {
        // Creating a Sample Async Task
    }
 
    @Override
    protected String doInBackground(Void... voids) {
        return performBlockingTask();
    }
 
    @Override
    protected void onProgressUpdate(Integer... progress) {
        mProgessBar.setProgress(progress);
    }
 
    @Override
    protected void onPostExecute(String result) {
        mTextView.setText(result);
    }
    
}.execute();

问题:

  • 不支持配置更改。
  • 没有错误处理程序,所以我们必须询问 onPostExecute 结果是否是错误的。

每个 AsyncTask 实例通常只/只执行一次。

结论

至此,我们结束了我们关于后台处理的文章,因为您可以看到这些方法存在某些问题和问题,因此选择正确的方法(适合您的需要)应该是一件容易的事!