📜  用于从后台线程更新 UI(用户界面)的 Android 函数的名称是什么? (1)

📅  最后修改于: 2023-12-03 15:27:10.185000             🧑  作者: Mango

用于从后台线程更新 UI 的 Android 函数的名称是什么?

在 Android 应用程序中,由于主线程负责更新 UI,所以后台线程无法直接更新 UI。但有时需要在后台线程中执行耗时操作,并在操作完成后更新 UI。为了实现这一点,Android 提供了一些机制,其中最常用的机制是使用 AsyncTask 类。

AsyncTask 类

AsyncTask 是一种异步任务,用于在后台线程中执行任务并在执行完毕后更新 UI。AsyncTask 提供了 4 个回调方法,它们分别是:

  • onPreExecute():在 doInBackground() 方法执行之前调用,一般用于执行一些初始化操作,例如显示进度条等。
  • doInBackground():在后台线程中执行任务,在该方法中可以调用 publishProgress() 方法更新任务进度。
  • onProgressUpdate():在 doInBackground() 方法中调用 publishProgress() 方法后,在主线程中执行,用于更新任务进度。
  • onPostExecute():在 doInBackground() 方法执行完毕后调用,在主线程中执行,用于更新 UI 和执行一些清理操作。

以下是一个使用 AsyncTask 实现后台线程更新 UI 的例子:

public class MyTask extends AsyncTask<Void, Integer, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // 在 doInBackground 方法之前执行,例如显示进度条等
    }

    @Override
    protected String doInBackground(Void... voids) {
        // 在后台线程中执行任务,可以调用 publishProgress 方法更新任务进度
        return "Task Result";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        // 在主线程中执行,用于更新任务进度
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // 在 doInBackground 方法执行完毕后调用,在主线程中执行,用于更新 UI 和执行一些清理操作
    }
}
使用 AsyncTask 更新 UI

使用 AsyncTask 更新 UI 的步骤如下:

  1. 创建一个 AsyncTask 的子类。
  2. 在子类中实现 doInBackground() 方法,该方法用于在后台线程中执行任务。
  3. 在子类中实现 onPreExecute() 方法,在 doInBackground() 方法执行之前调用,一般用于执行一些初始化操作,例如显示进度条等。
  4. 在子类中实现 onProgressUpdate() 方法,在 doInBackground() 方法中调用 publishProgress() 方法后,在主线程中执行,用于更新任务进度。
  5. 在子类中实现 onPostExecute() 方法,在 doInBackground() 方法执行完毕后调用,在主线程中执行,用于更新 UI 和执行一些清理操作。
  6. 在主线程中创建 AsyncTask 的实例,调用 execute() 方法执行任务。

以下是一个使用 AsyncTask 更新 UI 的例子:

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = findViewById(R.id.text_view);

        MyTask myTask = new MyTask();
        myTask.execute();
    }

    private class MyTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... voids) {
            // 在后台线程中执行任务,可以调用 publishProgress 方法更新任务进度
            return "Task Result";
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            // 在 doInBackground 方法执行完毕后调用,在主线程中执行,用于更新 UI 和执行一些清理操作
            mTextView.setText(s);
        }
    }
}

在上面的例子中,我们创建了一个名为 MyTask 的 AsyncTask 子类,并在其中实现了 doInBackground() 和 onPostExecute() 方法。在 onCreate() 方法中,我们创建了 MyTask 的实例并调用了 execute() 方法。当 execute() 方法被调用时,AsyncTask 就会启动一个后台线程并执行 doInBackground() 方法。在 doInBackground() 方法执行完毕后,onPostExecute() 方法就会在主线程中执行,我们可以在该方法中更新 UI。