package org.jerry;

import org.hwq.dbutil.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
private TextView info;
private Button runWrongBtn;
private Button runRightBtn;
private Button showInfoBtn;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

holdUIComponents();
showInfo();
}

private void holdUIComponents() {
info = (TextView) findViewById(R.id.info);
runWrongBtn = (Button) findViewById(R.id.runWrongBtn);
runRightBtn = (Button) findViewById(R.id.runRightBtn);
showInfoBtn = (Button) findViewById(R.id.showInfoBtn);

runWrongBtn.setOnClickListener(this);
runRightBtn.setOnClickListener(this);
showInfoBtn.setOnClickListener(this);
}

public void onClick(View v) {
switch (v.getId()) {
case R.id.runWrongBtn:
runWrong();
break;
case R.id.runRightBtn:
runRight();
break;
case R.id.showInfoBtn:
showInfo();
break;
}
}

private void runWrong() {
//因为不同步,会导致异常:database is locked
RunWrongThread t0 = new RunWrongThread();
RunWrongThread t1 = new RunWrongThread();

t0.start();
t1.start();

try {
t0.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

showInfo();
}

private void runRight() {
//有同步,执行正常
RunRightThread t0 = new RunRightThread();
RunRightThread t1 = new RunRightThread();

t0.start();
t1.start();

try {
t0.join();
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

showInfo();
}

private void showInfo() {
int userNums = DBUtil.getUserNums(getApplicationContext());
info.setText(Integer.toString(userNums));
}

class RunWrongThread extends Thread {

@Override
public void run() {
DBOpenHelper dbHelper = new DBOpenHelper(getApplicationContext());

for (int i = 0; i < 100; i++) {
User user = new User();
user.setName("name" + i);
user.setAge(i);
user.setEmail("email" + i);

dbHelper.insert(user);
}

dbHelper.close();
}

}

class RunRightThread extends Thread {

@Override
public void run() {
for (int i = 0; i < 100; i++) {
User user = new User();
user.setName("name" + i);
user.setAge(i);
user.setEmail("email" + i);

DBUtil.insertUser(getApplicationContext(), user);
}

DBUtil.close();
}

}
}


package org.jerry;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "db";
private static final int DB_VERSION = 1;

private static final String T_USER = "t_user";
private static final String T_USER_COLUMN_ID = "id";
private static final String T_USER_COLUMN_NAME = "name";
private static final String T_USER_COLUMN_AGE = "age";
private static final String T_USER_COLUMN_EMAIL = "email";
private static final String T_USER_SQL = "create table " + T_USER + " (" + T_USER_COLUMN_ID + " integer primary key autoincrement, " + T_USER_COLUMN_NAME + " text, " + T_USER_COLUMN_AGE + " integer, " + T_USER_COLUMN_EMAIL + " text)";

public DBOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(T_USER_SQL);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

public void insert(User user) {
if (user == null) {
return;
}

final ContentValues values = new ContentValues();
values.put(T_USER_COLUMN_NAME, user.getName());
values.put(T_USER_COLUMN_AGE, user.getAge());
values.put(T_USER_COLUMN_EMAIL, user.getEmail());

final SQLiteDatabase db = getWritableDatabase();
db.insert(T_USER, null, values);
}

public int getUserNums() {
final SQLiteDatabase db = getReadableDatabase();
final Cursor cursor = db.query(T_USER, null, null, null, null, null, null);

if (cursor == null) {
return 0;
}

int count = cursor.getCount();
cursor.close();

return count;
}
}


package org.jerry;

import android.content.Context;

public class DBUtil {
private static DBOpenHelper dbHelper;

private static void ensureDBHelperExist(Context context) {
if (dbHelper == null) {
dbHelper = new DBOpenHelper(context);
}
}

/**
* 插入user
* @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
* @param user
*/
public synchronized static void insertUser(Context context, User user) {
ensureDBHelperExist(context);
dbHelper.insert(user);
}

/**
* @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
* @return
*/
public synchronized static int getUserNums(Context context) {
ensureDBHelperExist(context);
return dbHelper.getUserNums();
}

public synchronized static void close() {
if (dbHelper != null) {
dbHelper.close();
dbHelper = null;
}
}
}

更多相关文章

  1. Android为每个应用程序分配的内存大小是多
  2. android拍照造成内存泄露问题
  3. Android开发学习笔记(十二) 获取系统可用内存
  4. Android中图片占用内存的计算
  5. android性能之一:内存泄露、内存溢出的区别及原理分析
  6. Android 内存溢出解决方案(OOM) 整理总结
  7. android内存管理

随机推荐

  1. 一个android 异步多线程类介绍
  2. Performance Tips for Android’s ListVi
  3. android 数组数据绑定到listview
  4. Android.mk添加第三方jar包
  5. Android(安卓)Saving Data
  6. Android(安卓)ExpandableListView分组效
  7. android 可以拖动的圆形 进度条
  8. Android(安卓)Auto-IP support
  9. android websocket推送
  10. Android(安卓)获取手机应用信息