如何在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
相关产品推荐
相关产品推荐

