美文网首页
2018-03-29

2018-03-29

作者: 金元宝加 | 来源:发表于2018-03-29 10:17 被阅读0次

    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);
    }
    

    }

    ···

    相关文章

      网友评论

          本文标题:2018-03-29

          本文链接:https://www.haomeiwen.com/subject/hitmcftx.html