美文网首页
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);
}

}

···

相关文章

  • 策略31

    603918 - 16.33 - 16.33 - c31 - 2018-03-29 09:35:29 - 17.0...

  • 2018-03-29

    2018-03-26 晋先森 关注 2018-03-29 17:44 · 字数 26074 · 阅读 1 · 日记...

  • 2018-03-29

    2018-03-29 180 戴师傅 简书作者 2018.03.29 21:27 打开App 2018-03-29...

  • 今日无所言

    2018-03-29 星期四 天气 晴 不想写东西,没有读书,没有惊喜的工作日

  • selenium+python处理警示框

    author="jolting" date="2018-03-29" 执行同事的自动化用例时,碰到alter的没处...

  • Jason外贸旅途-西班牙语(3)

    Jason外贸旅途-西班牙语(3) 2018-03-29原创公众号:Jason外贸旅途 Jason外贸旅途-西班牙...

  • 2018-1太平金科新活力:五湖四海组第三天培训日记

    不积跬步,无以至千里;不积小流,无以成江海。——荀子 时间:2018-03-29 -----------...

  • 打卡2018.3.30

    thy123456 2018-03-29 21:23 · 字数 215 · 阅读 0 · 日记本 姓名:田宏宇~公...

  • 活在当下

    2018-03-29 简书作者: Michael 六项精进学习 姓名:Michael 部门:业务部 组别:待定 【...

  • Vue原理浅析^_^

    title: Vuedate: 2018-03-29 13:39:09tags: Vue2是一个典型的MVVM框架...

网友评论

      本文标题:2018-03-29

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