2018-03-29

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 {

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 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 loader, Cursor data) {
    mAdapter.swapCursor(data);
}

public void onLoaderReset(Loader loader) {
    mAdapter.swapCursor(null);
}

}

···

你可能感兴趣的:(2018-03-29)