Android中使用ContentProvider管理系统资源的实例

ContentProvider管理联系人的实例:

package com.android.xiong.getsystemcontentprovidertest; 

import java.util.ArrayList; 

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.LayoutParams;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast; 

public class MainActivity extends Activity { 

  private Button bt1, bt2;
  private ExpandableListView exp1; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bt1 = (Button) findViewById(R.id.bt1);
    bt1.setOnClickListener(new LookPresonClick());
    bt2 = (Button) findViewById(R.id.bt2);
    bt2.setOnClickListener(new AddPersonClick()); 

  } 

  class AddPersonClick implements OnClickListener { 

    @Override
    public void onClick(View v) {
      // 获取程序界面中的桑文本框
      String name = ((EditText) findViewById(R.id.ed1)).getText()
          .toString();
      String phone = ((EditText) findViewById(R.id.ed2)).getText()
          .toString();
      String email = ((EditText) findViewById(R.id.ed3)).getText()
          .toString();
      // 创建一个空的ContentValue
      ContentValues values = new ContentValues();
      // 向RawContacts.CONTNT_URI执行一个空值插入
      // 目的是获取系统返回的rawContactId
      Uri rawContactsUri = getContentResolver().insert(
          RawContacts.CONTENT_URI, values);
      long rawContactId = ContentUris.parseId(rawContactsUri);
      values.clear();
      values.put(Data.RAW_CONTACT_ID, rawContactId);
      // 设置内容类型
      values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
      // 设置联系人名字
      values.put(StructuredName.GIVEN_NAME, name);
      // 向联系人Uri添加联系人名字
      getContentResolver().insert(
          android.provider.ContactsContract.Data.CONTENT_URI, values);
      values.clear();
      values.put(Data.RAW_CONTACT_ID, rawContactId);
      values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
      // 设置联系人的电话
      values.put(Phone.NUMBER, phone);
      // 设置电话类型
      values.put(Phone.TYPE, Phone.TYPE_MOBILE);
      // 向联系人电话Uri添加电话号码
      getContentResolver().insert(
          android.provider.ContactsContract.Data.CONTENT_URI, values);
      values.clear();
      values.put(Data.RAW_CONTACT_ID, rawContactId);
      values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
      // 设置联系人的email地址
      values.put(Email.DATA, email);
      // 设置email的类型
      values.put(Email.TYPE, Email.TYPE_WORK);
      getContentResolver().insert(
          android.provider.ContactsContract.Data.CONTENT_URI, values);
      Toast.makeText(MainActivity.this, "添加联系人信息成功", Toast.LENGTH_LONG)
          .show(); 

    } 

  } 

  class LookPresonClick implements OnClickListener { 

    @Override
    public void onClick(View v) {
      // 定义两个List来封装系统联系人信息,指定联系人的电话,email等详情
      final ArrayList<String> names = new ArrayList<String>();
      final ArrayList<ArrayList<String>> details = new ArrayList<ArrayList<String>>();
      // 使用ContentResolver查找联系人数据
      Cursor cursor = getContentResolver().query(
          ContactsContract.Contacts.CONTENT_URI, null, null, null,
          null);
      // 遍历结果 获取系统所有联系人信息
      while (cursor.moveToNext()) {
        // 获取联系人ID
        String contactid = cursor.getString(cursor
            .getColumnIndex(ContactsContract.Contacts._ID));
        // 获取联系人的名字
        String name = cursor
            .getString(cursor
                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        names.add(name);
        // 使用ContentResolver查找联系人的电话号码
        Cursor phones = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                + "= ?", new String[] { contactid }, null);
        ArrayList<String> detail = new ArrayList<String>();
        // 遍历查询结果,获取该联系人的多个电话
        while (phones.moveToNext()) {
          // 获取查询的结果中的电话号码列
          String phoneNumber = phones
              .getString(phones
                  .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
          detail.add("电话号码是:" + phoneNumber);
        }
        phones.close();
        // 使用ContentResolver查找联系人的E-mail地址
        Cursor emails = getContentResolver().query(
            ContactsContract.CommonDataKinds.Email.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Email.CONTACT_ID
                + " =?", new String[] { contactid }, null);
        // 遍历查询结果,获取该联系人的多个email地址
        while (emails.moveToNext()) {
          // 获取查询的结果中email地址中列的数据
          String emailAddress = emails
              .getString(emails
                  .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
          detail.add("email是:" + emailAddress);
        }
        emails.close();
        details.add(detail); 

      }
      cursor.close(); 

      // 加载result.xml界面布局代表的视图
      View resultDialog = getLayoutInflater().inflate(R.layout.result,
          null);
      exp1 = (ExpandableListView) resultDialog.findViewById(R.id.exp1);
      // 创建一个ExpandableListAdapter对象
      ExpandableListAdapter adapter = new BaseExpandableListAdapter() { 

        @Override
        public boolean isChildSelectable(int groupPosition,
            int childPosition) {
          // TODO Auto-generated method stub
          return true;
        } 

        @Override
        public boolean hasStableIds() {
          // TODO Auto-generated method stub
          return true;
        } 

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
          TextView text = getTextVeiw();
          text.setText(getGroup(groupPosition).toString());
          return text;
        } 

        @Override
        public long getGroupId(int groupPosition) {
          // TODO Auto-generated method stub
          return groupPosition;
        } 

        @Override
        public int getGroupCount() {
          // TODO Auto-generated method stub
          return names.size();
        } 

        @Override
        public Object getGroup(int groupPosition) {
          // TODO Auto-generated method stub
          return names.get(groupPosition);
        } 

        @Override
        public int getChildrenCount(int groupPosition) {
          // TODO Auto-generated method stub
          return details.get(groupPosition).size();
        } 

        private TextView getTextVeiw() {
          AbsListView.LayoutParams lp = new LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT, 64);
          TextView textview = new TextView(MainActivity.this);
          textview.setLayoutParams(lp);
          textview.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
          textview.setPadding(36, 0, 0, 0);
          textview.setTextSize(20);
          return textview;
        } 

        @Override
        public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
          TextView textview = getTextVeiw();
          textview.setText(getChild(groupPosition, childPosition)
              .toString()); 

          return textview;
        } 

        @Override
        public long getChildId(int groupPosition, int childPosition) {
          // TODO Auto-generated method stub
          return childPosition;
        } 

        @Override
        public Object getChild(int groupPosition, int childPosition) {
          return details.get(groupPosition).get(childPosition);
        }
      };
      exp1.setAdapter(adapter);
      // 使用对话框来显示查询结果
      new AlertDialog.Builder(MainActivity.this).setView(resultDialog)
          .setPositiveButton("确定", null).show();
    } 

  } 

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  } 

}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity" > 

    <EditText
    android:id="@+id/ed1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="输入联系人姓名"/>
    <EditText
      android:id="@+id/ed2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="输入联系人电话"/>
    <EditText
      android:id="@+id/ed3"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="输入联系人email"/>
    <Button
      android:id="@+id/bt2"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="添加联系人信息"/>
  <Button
    android:id="@+id/bt1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="查看联系人" /> 

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" > 

  <ExpandableListView
    android:id="@+id/exp1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
  </ExpandableListView>
</LinearLayout>

使用ContentProvider管理多媒体内容
Android为多媒体提供的Uri:
1、MediaStore.Audio.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的音频文件
2、MediaStore.Audio.Mdia.INTERNAL_CONTENT_URI:存储在手机内部上的音频文件
3、MediaStore.Images.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的图片文件
4、MediaStore.Images.Mdia.INTERNAL_CONTENT_URI:存储在内部设备上的图片文件
5、MediaStore.Video.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的音频文件
6、MediaStore.Video.Mdia.INTERNAL_CONTENT_URI:存储在内部设备上的音频文件
实例:

package com.example.mediaprovidertest; 

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView; 

public class MainActivity extends Activity { 

  private Button bt1, bt2;
  private ListView list1; 

  ArrayList<String> names = new ArrayList<String>();
  ArrayList<String> descs = new ArrayList<String>();
  ArrayList<String> filenames = new ArrayList<String>(); 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bt1 = (Button) findViewById(R.id.bt1);
    bt2 = (Button) findViewById(R.id.bt2);
    list1 = (ListView) findViewById(R.id.list); 

    bt1.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        // 清空names、desc、fileName集合里原有的数据
        names.clear();
        descs.clear();
        filenames.clear();
        // 通过ContentResolver查询所有图片信息
        Cursor curos = getContentResolver().query(
            Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        while (curos.moveToNext()) {
          // 获取图片显示的名字
          String name = curos.getString(curos
              .getColumnIndex(Media.DISPLAY_NAME));
          // 获取图片的详细信息、
          String desc = curos.getString(curos
              .getColumnIndex(Media.DESCRIPTION));
          // 将图片名保存的位置数据
          byte[] data = curos.getBlob(curos
              .getColumnIndex(Media.DATA));
          // 将图片名添加到names集合中
          names.add(name);
          // 将图片描述添加到desc集合中
          descs.add(desc);
          // 将图片保存路径添加到fileNames集合中
          filenames.add(new String(data, 0, data.length - 1));
        }
        // 创建一个List集合的元素是map
        List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();
        // 将names、descs两个集合对象的数据转换到map集合
        for (int i = 0; i < names.size(); i++) {
          Map<String, Object> listitem = new HashMap<String, Object>();
          listitem.put("name", names.get(i));
          listitem.put("desc", descs.get(i));
          listitems.add(listitem);
        }
        SimpleAdapter simple = new SimpleAdapter(MainActivity.this,
            listitems, R.layout.items, new String[] { "name",
                "desc" }, new int[] { R.id.txt1, R.id.txt2 });
        list1.setAdapter(simple); 

      }
    });
    list1.setOnItemClickListener(new OnItemClickListener() { 

      @Override
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
          long arg3) {
        // 加载view.xml界面布局代表视图
        View view = getLayoutInflater().inflate(R.layout.view, null);
        // 获取viewDialog中ImageView组件
        ImageView image1 = (ImageView) view.findViewById(R.id.image1);
        // 设置image显示指定的图片
        image1.setImageBitmap(BitmapFactory.decodeFile(filenames
            .get(arg2)));
        // 使用对话框显示用户单击的图片
        new AlertDialog.Builder(MainActivity.this).setView(view)
            .setPositiveButton("确定", null).show(); 

      }
    });
    bt2.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        // 创建ContentValues对象,准备插入数据
        ContentValues values = new ContentValues();
        values.put(Media.DISPLAY_NAME, "jinta");
        values.put(Media.DESCRIPTION, "金塔");
        values.put(Media.MIME_TYPE, "image/jpeg");
        // 插入数据对应的Uri
        Uri uri = getContentResolver().insert(
            Media.EXTERNAL_CONTENT_URI, values);
        // 加载应用程序下的jinta图片
        Bitmap bitmap = BitmapFactory.decodeResource(
            MainActivity.this.getResources(), R.drawable.jinta);
        OutputStream os = null;
        try {
          // 获取刚插入的数据的Uri对应的输出流
          os = getContentResolver().openOutputStream(uri);
          // 将bitmap图片保存到Uri对应的数据节点中
          bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
          os.close();
        } catch (IOException io) {
          io.printStackTrace();
        }
      }
    });
  } 

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  } 

}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity" > 

  <Button
    android:id="@+id/bt1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="查看图片"/>
  <Button
    android:id="@+id/bt2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="添加图片"/>
  <ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"></ListView> 

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  <TextView
    android:id="@+id/txt1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
  <TextView
    android:id="@+id/txt2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/> 

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" > 

    <ImageView
      android:id="@+id/image1"
      android:layout_width="match_parent"
      android:layout_height="match_parent" /> 

</LinearLayout>
(0)

相关推荐

  • Android数据持久化之ContentProvider机制详解

    本文实例讲述了Android数据持久化之ContentProvider机制.分享给大家供大家参考,具体如下: 一般而言,android操作系统的应用程序所建立的数据只允许自己使用,应用程序彼此间无法借助公用存储器来共享数据,android系统提供了一个机制,即内容提供器(ContentProvider),来公开自己私有的数据到数据内容器,通过该机制,可以供其他应用程序来读取自己内部的数据,当然也可以访问其他应用程序的数据.通常,内容提供器背后都有SQLite数据库的支持,用以存储内容提供内部数据

  • 基于Android ContentProvider的总结详解

    1.适用场景1) ContentProvider为存储和读取数据提供了统一的接口2) 使用ContentProvider,应用程序可以实现数据共享3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)2.相关概念介绍1)ContentProvider简介当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的

  • Android 自定义ContentProvider简单实例

    Android 自定义ContentProvider简单实例 Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下. 要使用ContentProvider来操作数据,必须要有保存数据的场所.可以使用文件或SQLite数据库的方式来保存数据,通常使用SQLite数据库. 1,创建一个数据库帮助类,归根结底都是它在操作数据库.代码如下: package com.njue; import android.content.Context; import

  • Android应用中使用ContentProvider扫描本地图片并显示

    之前群里面有朋友问我,有没有关于本地图片选择的Demo,类似微信的效果,他说网上没有这方面的Demo,问我能不能写一篇关于这个效果的Demo,于是我研究了下微信的本地图片选择的Demo,自己仿照的写了下分享给大家,希望对以后有这样子需求的朋友有一点帮助吧,主要使用的是ContentProvider扫描手机中的图片,并用GridView将图片显示出来,关于GridView和ListView显示图片的问题,一直是一个很头疼的问题,因为我们手机的内存有限,手机给每个应用程序分配的内存也有限,所以图片多

  • Android开发教程之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的.那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的"数据库". ContentProvider提供了一种多应用间数据共享的方式. ContentProvider是个实现了一组用于提供其他应用程序存取数据的标准方法的类.应用

  • android基础总结篇之八:创建及调用自己的ContentProvider

    今天我们来讲解一下如何创建及调用自己的ContentProvider. 在前面两篇文章中我们分别讲了如何读写联系人和短消息,相信大家对于ContentProvider的操作方法已经有了一定程度的了解.在有些场合,除了操作ContentProvider之外,我们还有可能需要创建自己的ContentProvider,来提供信息共享的服务,这就要求我们很好的掌握ContentProvider的创建及使用技巧.下面我们就由表及里的逐步讲解每个步骤. 在正式开始实例演示之前,我们先来了解以下两个知识点:

  • 实例讲解Android中ContentProvider组件的使用方法

    ContentProvider基本使用 为了在应用程序之间交换数据,android提供了ContentProvider,ContentProvider是不同应用程序之间进行数据交换的标准API,当一个应用程序需要把自己的数据暴露给其他程序使用时,该应用程序就可以通过提供ContentPRovider来实现,其他应用程序就可以通过ContentResolver来操作ContentProvider暴露的数据. 实现ContentProvider的步骤: 1)编写一个类,继承ContentProvid

  • Android中自定义ContentProvider实例

    //以下为TestBaidu MainActivity如下: 复制代码 代码如下: package cn.testbaidu; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import an

  • Android中使用ContentProvider管理系统资源的实例

    ContentProvider管理联系人的实例: package com.android.xiong.getsystemcontentprovidertest; import java.util.ArrayList; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentUris; import android.content.ContentValues; import

  • Android 中自定义ContentProvider与ContentObserver的使用简单实例

    Android 中自定义ContentProvider与ContentObserver的使用简单实例 示例说明: 该示例中一共包含两个工程.其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver监听自定义ContentProvider的数据变化 以下代码为工程TestContentProvider ContentProviderTest如下: package cn.testcontentp

  • Android 中ViewPager重排序与更新实例详解

    Android 中ViewPager重排序与更新实例详解 最近的项目中有栏目订阅功能,在更改栏目顺序以后需要更新ViewPager.类似于网易新闻的频道管理. 在重新排序之后调用了PagerAdapter的notifyDataSetChanged方法,发现ViewPager并没有更新,于是我开始跟踪源码,在调用PagerAdapter的notifyDataSetChanged方法后,会触发Viewpager的dataSetChanged方法. void dataSetChanged() { //

  • Android中的指纹识别demo开发实例

    指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说,纯本地的

  • Android 中隐藏虚拟按键的方法实例代码

    下面通过一段代码给大家讲解android 隐藏虚拟按键的方法,废话不多说了,大家多多看看代码和注释吧,具体代码如下所示: /** * 隐藏虚拟按键,并且全屏 */ protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDec

  • Android 中Seekbar详解及简单实例

    Android 中Seekbar详解及简单实例 做到音频播放和音乐播放时,大多数都要用到Seekbar.现在我先简单介绍下Seekbar的几个重要属性. android:max 设置值的大小 . android:thumb="@drawable/" 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可. android:thumbOffset 拖动图标的偏量值,可以让拖动图标超过bar的

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • Android中Handler与Message的简单实例

    Android中Handler与Message的简单实例 前言: 虽然笔者已经学习了Android的AsyncTask来实现一部消息的处理.但是在android的学习中,经常会在一些demo中看到Handler与Message的一些使用,所以Handler与Message的学习也是有必要了.至于学多少,笔者还是比较坚持自己的看法,"用多少,学多少",毕竟已经有了AsyncTask如此方便的东西,Handler与Message也不是那么必不可缺了.(如此文的简单了解一下还是不需要花太多时

  • Android中AsyncTask异步任务使用详细实例(一)

    AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用AsyncTask最少要重写以下两个方法: 1.doInBackground(Params-) 后台执行,比较耗时的操作都可以放在这里.注意这里不能直接操作UI.此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间.在执行过程中可以调用publicProgress(Progres

  • Android中文件的压缩和解压缩实例代码

    使用场景 当我们在应用的Assets目录中需要加入文件时,可以直接将源文件放入,但这样会造成打包后的apk整体过大,此时就需要将放入的文件进行压缩.又如当我们需要从服务器中下载文件时,如果下载源文件耗时又消耗流量,较大文件需要压缩,可以使得传输效率大大提高.下面我们就学习下基本的文件压缩和解压缩.Java中提供了压缩和解压缩的输入输出流 public static void zip(String src,String dest) throwsIOException { //定义压缩输出流 Zip

随机推荐