You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中用AsyncTask执行后台权限检查并返回结果

使用AsyncTask实现后台权限检查并返回结果

步骤1:定义AsyncTask子类

在你的MainActivity中创建静态内部类(搭配弱引用避免内存泄漏):

import android.os.AsyncTask;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import androidx.core.content.ContextCompat;
import java.lang.ref.WeakReference;

private static class PermissionCheckTask extends AsyncTask<Void, Void, Integer> {
    private final WeakReference<MainActivity> activityRef;

    public PermissionCheckTask(MainActivity activity) {
        this.activityRef = new WeakReference<>(activity);
    }

    @Override
    protected Integer doInBackground(Void... voids) {
        MainActivity activity = activityRef.get();
        if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
            return 0;
        }

        int my_counter = 0;

        // 执行权限检查逻辑
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && Environment.isExternalStorageManager()) {
            my_counter += 1;
        }
        if (ContextCompat.checkSelfPermission(activity, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
                || ContextCompat.checkSelfPermission(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            my_counter += 1;
        }
        if (activity._checkPermission("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata%2Fnet.wargaming.wot.blitz%2Ffiles%2Fpacks/document/primary%3AAndroid%2Fdata%2Fnet.wargaming.wot.blitz%2Ffiles%2Fpacks")) {
            my_counter += 1;
        }
        if (activity._checkPermission("content://com.android.externalstorage.documents/tree/primary%3AMTG%20MODS/document/primary%3AMTG%20MODS")) {
            my_counter += 1;
        }

        return my_counter;
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        MainActivity activity = activityRef.get();
        if (activity == null) {
            return;
        }

        // 这里处理返回结果,比如更新UI、弹窗提示等
        activity.handlePermissionCheckResult(result);
    }
}

步骤2:添加结果处理方法

在MainActivity中定义处理结果的方法,方便后续逻辑扩展:

private void handlePermissionCheckResult(int counter) {
    // 示例:更新TextView显示结果
    // textView.setText("通过的权限检查数量:" + counter);
    // 可替换为你实际需要的业务逻辑
}

步骤3:在按钮点击事件中启动AsyncTask

修改按钮监听代码,触发后台任务:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View _view) {
        new PermissionCheckTask(MainActivity.this).execute();
    }
});

关键注意点

  • 静态内部类+弱引用:避免AsyncTask持有Activity强引用导致内存泄漏,尤其是Activity销毁后任务未完成的场景。
  • 线程规则:doInBackground运行在子线程,不能执行UI操作;所有UI更新必须放在onPostExecute(主线程执行)中。
  • 方法可访问性:确保_checkPermission是MainActivity中可调用的方法(如private或public)。

内容的提问来源于stack exchange,提问作者MTG MODS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:05:26