异步loader项目的结果图:
加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
异步Loader类的主逻辑代码文件:
<span style="font-size:18px;">package com.example.day17_aysnctaskloader;
import java.io.File;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.AsyncTaskLoader;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.TextView;
@SuppressLint("NewApi")
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
ListView lv;
TextView tv_show;
LoaderManager manager;
SimpleCursorAdapter adapter;
static SQLiteDatabase db;
@SuppressLint("NewApi") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView) findViewById(R.id.lv);
tv_show=(TextView) findViewById(R.id.tv_show);
manager=getLoaderManager();
manager.initLoader(1, null, this);
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"Download"+File.separator+"info.db";
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
adapter=new SimpleCursorAdapter(getApplicationContext(), R.layout.item, null, new String[]{"_id","name"},new int[]{R.id.m_id,R.id.m_name},SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
lv.setEmptyView(tv_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;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId())
{
case R.id.operation:
Intent intent=new Intent();
intent.setAction("hh.pp.day");
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
MyLoader loader=new MyLoader(MainActivity.this);
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
adapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
adapter.swapCursor(null);
}
//自定义loader
@SuppressLint("NewApi")
public static class MyLoader extends AsyncTaskLoader<Cursor>
{
@SuppressLint("NewApi")
public MyLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
//当创建完毕 加载数据的方法,启动加载
@SuppressLint("NewApi")
@Override
protected void onStartLoading() {
super.onStartLoading();
//必须加,强制向下执行 强制加载异步数据,否则不向下执行
forceLoad();
}
//开启后台,做耗时操作
@Override
public Cursor loadInBackground() {
Cursor c=db.rawQuery("select * from person", null);
return c;
}
//执行完成loadInBackground之后调用,接受loadInBackground返回的数据
@Override
public void deliverResult(Cursor data) {
// TODO Auto-generated method stub
super.deliverResult(data);
}
}
}
</span>
主布局文件:
<span style="font-size:18px;"><RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="暂无数据"
android:gravity="center"
android:textColor="#00ff00"/>
</RelativeLayout>
</span>
适配器布局文件:
<span style="font-size:18px;"><?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="horizontal" >
<TextView
android:id="@+id/m_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="18sp"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/m_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000ff"
android:textSize="18sp"
android:layout_margin="10dp"/>
</LinearLayout>
</span>
跳转到的操作数据的APP:
跳转后见到的页面:
清单文件中:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<activity
android:name=".SecondActivity">
<intent-filter>
<action android:name="hh.pp.day"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
建项目时第一个页面不需要动,再建一个类和布局:
第二个类逻辑代码文件:
package com.day17_lijieatloaderdb;
import java.io.File;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
public class SecondActivity extends Activity {
EditText et_id,et_name;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
et_id=(EditText) findViewById(R.id.et_id);
et_name=(EditText) findViewById(R.id.et_name);
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"Download"+File.separator+"info.db";
db=SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
}
public void click(View v)
{
switch(v.getId())
{
case R.id.bt_add:
String id=et_id.getText().toString();
String name=et_name.getText().toString();
ContentValues values=new ContentValues();
values.put("_id",Integer.parseInt(id));
values.put("name",name);
db.insert("person", null, values);
finish();
break;
case R.id.bt_update:
String id2=et_id.getText().toString();
String name2=et_name.getText().toString();
ContentValues values2=new ContentValues();
values2.put("name",name2);
db.update("person", values2, "_id=?", new String[]{id2});
finish();
break;
case R.id.bt_delete:
String id3=et_id.getText().toString();
db.delete("person", "_id=?", new String[]{id3});
finish();
break;
}
}
}
第二个类的布局文件:
<?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" >
<EditText
android:id="@+id/et_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入id"/>
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入name"/>
<Button
android:id="@+id/bt_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加数据"
android:onClick="click"/>
<Button
android:id="@+id/bt_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新数据"
android:onClick="click"/>
<Button
android:id="@+id/bt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="click"/>
</LinearLayout>