Android LoaderManager异步数据加载读取手机存储中的音乐文件。
···
package com.example.myapplication;
import android.Manifest;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.MediaStore;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
private ListView listView;
// 使用SimpleCursorAdapter来填充数据
private SimpleCursorAdapter mAdapter;
// 使用CursorLoader来获取数据
private CursorLoader loader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.music_list);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {//这里可以写个对话框之类的项向用户解释为什么要申请权限,并在对话框的确认键后续再次申请权限
} else {
//申请权限,字符串数组内是一个或多个要申请的权限,1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,}, 1);
}
} else {
initMusic();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
initMusic();
Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
}
}
}
}
private void initMusic() {
// 这里创建Adapter时 注意不传递数据
mAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.list_item,
null, new String[]{ MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ARTIST}, new int[]{
R.id.music_name, R.id.music_singer}, 0);
listView.setAdapter(mAdapter);
// 通过异步的方式加载数据
LoaderManager manager = getLoaderManager();
// 第一个参数为id 第二个位Bundle数据 第三个为LoaderCallbacks
manager.initLoader(0, null, this);
}
// 首先检查指定的id是否存在,如果不存在才会触发该方法,通过该方法才能创建一个loader。
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// 查询音乐数据库 获取音乐数据 并排序
loader = new CursorLoader(this,
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
return loader;
}
// 完成对Ui控件的更新,如果不再使用,将自动释放loader的数据,不需要使用close();
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
···
网友评论