Android中常用的工具类总结

1.文件操作工具类

     /**
     * 以文件流的方式复制文件
     * @param src 文件源目录
     * @param dest 文件目的目录
     * @throws IOException  
     */
    public static void copyFile(String src,String dest) throws IOException{
        FileInputStream in=new FileInputStream(src);
        File file=new File(dest);
        if(!file.exists())
            file.createNewFile();
        FileOutputStream out=new FileOutputStream(file);
        int c;
        byte buffer[]=new byte[1024];
        while((c=in.read(buffer))!=-1){
            for(int i=0;i 1) {
    		for (int i = 0; i < dirs.length - 1; i++) {
    			ret = new File(ret, dirs[i]);
    		}
    	}
    	if (!ret.exists()) {
    		ret.mkdirs();
    	}
    }


2.Bitmap与DrawAble与byte[]与InputStream之间的转换工具类

package com.soai.imdemo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

/**
 * Bitmap与DrawAble与byte[]与InputStream之间的转换工具类
 * @author Administrator
 *
 */
public class FormatTools {
	private static FormatTools tools = new FormatTools();

	public static FormatTools getInstance() {
		if (tools == null) {
			tools = new FormatTools();
			return tools;
		}
		return tools;
	}

	// 将byte[]转换成InputStream
	public InputStream Byte2InputStream(byte[] b) {
		ByteArrayInputStream bais = new ByteArrayInputStream(b);
		return bais;
	}

	// 将InputStream转换成byte[]
	public byte[] InputStream2Bytes(InputStream is) {
		String str = "";
		byte[] readByte = new byte[1024];
		int readCount = -1;
		try {
			while ((readCount = is.read(readByte, 0, 1024)) != -1) {
				str += new String(readByte).trim();
			}
			return str.getBytes();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	// 将Bitmap转换成InputStream
	public InputStream Bitmap2InputStream(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		InputStream is = new ByteArrayInputStream(baos.toByteArray());
		return is;
	}

	// 将Bitmap转换成InputStream
	public InputStream Bitmap2InputStream(Bitmap bm, int quality) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, quality, baos);
		InputStream is = new ByteArrayInputStream(baos.toByteArray());
		return is;
	}

	// 将InputStream转换成Bitmap
	public Bitmap InputStream2Bitmap(InputStream is) {
		return BitmapFactory.decodeStream(is);
	}

	// Drawable转换成InputStream
	public InputStream Drawable2InputStream(Drawable d) {
		Bitmap bitmap = this.drawable2Bitmap(d);
		return this.Bitmap2InputStream(bitmap);
	}

	// InputStream转换成Drawable
	public Drawable InputStream2Drawable(InputStream is) {
		Bitmap bitmap = this.InputStream2Bitmap(is);
		return this.bitmap2Drawable(bitmap);
	}

	// Drawable转换成byte[]
	public byte[] Drawable2Bytes(Drawable d) {
		Bitmap bitmap = this.drawable2Bitmap(d);
		return this.Bitmap2Bytes(bitmap);
	}

	// byte[]转换成Drawable
	public Drawable Bytes2Drawable(byte[] b) {
		Bitmap bitmap = this.Bytes2Bitmap(b);
		return this.bitmap2Drawable(bitmap);
	}

	// Bitmap转换成byte[]
	public byte[] Bitmap2Bytes(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}

	// byte[]转换成Bitmap
	public Bitmap Bytes2Bitmap(byte[] b) {
		if (b.length != 0) {
			return BitmapFactory.decodeByteArray(b, 0, b.length);
		}
		return null;
	}

	// Drawable转换成Bitmap
	public Bitmap drawable2Bitmap(Drawable drawable) {
		Bitmap bitmap = Bitmap
				.createBitmap(
						drawable.getIntrinsicWidth(),
						drawable.getIntrinsicHeight(),
						drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
								: Bitmap.Config.RGB_565);
		Canvas canvas = new Canvas(bitmap);
		drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
				drawable.getIntrinsicHeight());
		drawable.draw(canvas);
		return bitmap;
	}

	// Bitmap转换成Drawable
	public Drawable bitmap2Drawable(Bitmap bitmap) {
		BitmapDrawable bd = new BitmapDrawable(bitmap);
		Drawable d = (Drawable) bd;
		return d;
	}
}



3.其它常用工具类

一. 检查网络是否可用.

ConnectionUtil.java

[java]  view plain copy
  1. import android.app.AlertDialog;  
  2. import android.content.Context;  
  3. import android.content.DialogInterface;  
  4. import android.net.ConnectivityManager;  
  5. import android.net.NetworkInfo;  
  6.   
  7.   
  8. public class ConnectionUtil {  
  9. /** 
  10. * 检查网络是否可用 
  11. * @param context 
  12. 应用程序的上下文对象 
  13. * @return 
  14. */  
  15. public static boolean isNetworkAvailable(Context context) {  
  16. ConnectivityManager connectivity = (ConnectivityManager) context  
  17. .getSystemService(Context.CONNECTIVITY_SERVICE);  
  18. //获取系统网络连接管理器  
  19. if (connectivity == null) {  
  20. //如果网络管理器为null  
  21. return false;  //返回false表明网络无法连接  
  22. else {  
  23. NetworkInfo[] info = connectivity.getAllNetworkInfo();  
  24. //获取所有的网络连接对象  
  25. if (info != null) {  
  26. //网络信息不为null时  
  27. for (int i = 0; i < info.length; i++) {  
  28. //遍历网路连接对象  
  29. if (info[i].isConnected()) {  
  30. //当有一个网络连接对象连接上网络时  
  31. return true;  //返回true表明网络连接正常  
  32. }   
  33. }  
  34. }  
  35. }  
  36. return false;    
  37. }  
  38.   
  39. public static void httpTest(final Context ctx,String title,String msg) {  
  40. if (!isNetworkAvailable(ctx)) {  
  41. AlertDialog.Builder builders = new AlertDialog.Builder(ctx);  
  42. builders.setTitle(title);  
  43. builders.setMessage(msg);  
  44. builders.setPositiveButton(android.R.string.ok,  
  45. new DialogInterface.OnClickListener() {  
  46. public void onClick(DialogInterface dialog, int which) {  
  47. //alert.dismiss();  
  48. }  
  49. });  
  50. AlertDialog alert = builders.create();  
  51. alert.show();  
  52. }  
  53. }  
  54. }  


二.读取流文件.

FileStreamTool.java

[java]  view plain copy
  1. import java.io.ByteArrayOutputStream;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.PushbackInputStream;  
  7.   
  8.   
  9. public class FileStreamTool {  
  10.   
  11.   
  12. public static void save(File file, byte[] data) throws Exception {  
  13. FileOutputStream outStream = new FileOutputStream(file);  
  14. outStream.write(data);  
  15. outStream.close();  
  16. }  
  17.    
  18. public static String readLine(PushbackInputStream in) throws IOException {  
  19. char buf[] = new char[128];  
  20. int room = buf.length;  
  21. int offset = 0;  
  22. int c;  
  23. loop: while (true) {  
  24. switch (c = in.read()) {  
  25. case -1:  
  26. case '\n':  
  27. break loop;  
  28. case '\r':  
  29. int c2 = in.read();  
  30. if ((c2 != '\n') && (c2 != -1)) in.unread(c2);  
  31. break loop;  
  32. default:  
  33. if (--room < 0) {  
  34. char[] lineBuffer = buf;  
  35. buf = new char[offset + 128];  
  36.    room = buf.length - offset - 1;  
  37.    System.arraycopy(lineBuffer, 0, buf, 0, offset);  
  38.     
  39. }  
  40. buf[offset++] = (char) c;  
  41. break;  
  42. }  
  43. }  
  44. if ((c == -1) && (offset == 0)) return null;  
  45. return String.copyValueOf(buf, 0, offset);  
  46. }  
  47.    
  48. /** 
  49. * 读取流 
  50. * @param inStream 
  51. * @return 字节数组 
  52. * @throws Exception 
  53. */  
  54. public static byte[] readStream(InputStream inStream) throws Exception{  
  55. ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
  56. byte[] buffer = new byte[1024];  
  57. int len = -1;  
  58. while( (len=inStream.read(buffer)) != -1){  
  59. outSteam.write(buffer, 0, len);  
  60. }  
  61. outSteam.close();  
  62. inStream.close();  
  63. return outSteam.toByteArray();  
  64. }  
  65. }  

三.文件断点续传.

MainActivity.java

[java]  view plain copy
  1. import java.io.File;  
  2. import java.io.OutputStream;  
  3. import java.io.PushbackInputStream;  
  4. import java.io.RandomAccessFile;  
  5. import java.net.Socket;  
  6. import cn.itcast.service.UploadLogService;  
  7. import cn.itcast.utils.StreamTool;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.view.View;  
  14. import android.widget.Button;  
  15. import android.widget.EditText;  
  16. import android.widget.ProgressBar;  
  17. import android.widget.TextView;  
  18. import android.widget.Toast;  
  19.   
  20.   
  21. public class MainActivity extends Activity {  
  22.     private EditText filenameText;  
  23.     private TextView resultView;  
  24.     private ProgressBar uploadbar;  
  25.     private UploadLogService service;  
  26.     private Handler handler = new Handler(){  
  27. @Override  
  28. public void handleMessage(Message msg) {  
  29. uploadbar.setProgress(msg.getData().getInt("length"));  
  30. float num = (float)uploadbar.getProgress() / (float)uploadbar.getMax();  
  31. int result = (int)(num * 100);  
  32. resultView.setText(result + "%");  
  33. if(uploadbar.getProgress() == uploadbar.getMax()){  
  34. Toast.makeText(MainActivity.this, R.string.success, 1).show();  
  35. }  
  36. }  
  37.     };  
  38.       
  39.     @Override  
  40.     public void onCreate(Bundle savedInstanceState) {  
  41.         super.onCreate(savedInstanceState);  
  42.         setContentView(R.layout.main);  
  43.           
  44.         service =  new UploadLogService(this);  
  45.         filenameText = (EditText)findViewById(R.id.filename);  
  46.         resultView = (TextView)findViewById(R.id.result);  
  47.         uploadbar = (ProgressBar)findViewById(R.id.uploadbar);  
  48.         Button button = (Button)findViewById(R.id.button);  
  49.         button.setOnClickListener(new View.OnClickListener() {  
  50.   
  51. public void onClick(View v) {  
  52. String filename = filenameText.getText().toString();  
  53. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  54. File file = new File(Environment.getExternalStorageDirectory(), filename);  
  55. if(file.exists()){  
  56. uploadbar.setMax((int)file.length());  
  57. uploadFile(file);  
  58. }else{  
  59. Toast.makeText(MainActivity.this, R.string.notexsit, 1).show();  
  60. }  
  61. }else{  
  62. Toast.makeText(MainActivity.this, R.string.sdcarderror, 1).show();  
  63. }  
  64. }  
  65. });  
  66.     }  
  67.   
  68.   
  69. private void uploadFile(final File file) {  
  70. new Thread(new Runnable() {  
  71.   
  72. public void run() {  
  73. try {  
  74. String sourceid = service.getBindId(file);  
  75. Socket socket = new Socket("192.168.1.100"7878);//根据IP地址和端口不同更改  
  76.            OutputStream outStream = socket.getOutputStream();   
  77.            String head = "Content-Length="+ file.length() + ";filename="+ file.getName()   
  78.              + ";sourceid="+(sourceid!=null ? sourceid : "")+"\r\n";  
  79.            outStream.write(head.getBytes());  
  80.              
  81.            PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());  
  82.   
  83. String response = StreamTool.readLine(inStream);  
  84.            String[] items = response.split(";");  
  85. String responseSourceid = items[0].substring(items[0].indexOf("=")+1);  
  86. String position = items[1].substring(items[1].indexOf("=")+1);  
  87. if(sourceid==null){//如果是第一次上传文件,在数据库中不存在该文件所绑定的资源id,入库  
  88. service.save(responseSourceid, file);  
  89. }  
  90. RandomAccessFile fileOutStream = new RandomAccessFile(file, "r");  
  91. fileOutStream.seek(Integer.valueOf(position));  
  92. byte[] buffer = new byte[1024];  
  93. int len = -1;  
  94. int length = Integer.valueOf(position);  
  95. while( (len = fileOutStream.read(buffer)) != -1){  
  96. outStream.write(buffer, 0, len);  
  97. length += len;//累加已经上传的数据长度  
  98. Message msg = new Message();  
  99. msg.getData().putInt("length", length);  
  100. handler.sendMessage(msg);  
  101. }  
  102. if(length == file.length()) service.delete(file);  
  103. fileOutStream.close();  
  104. outStream.close();  
  105.            inStream.close();  
  106.            socket.close();  
  107.        } catch (Exception e) {                      
  108.          Toast.makeText(MainActivity.this, R.string.error, 1).show();  
  109.        }  
  110. }  
  111. }).start();  
  112. }  
  113. }  

DBOpenHelper.java

[java]  view plain copy
  1. import android.content.Context;  
  2. import android.database.sqlite.SQLiteDatabase;  
  3. import android.database.sqlite.SQLiteOpenHelper;  
  4.   
  5.   
  6. public class DBOpenHelper extends SQLiteOpenHelper {  
  7.   
  8.   
  9. public DBOpenHelper(Context context) {  
  10. super(context, "itcast.db"null1);  
  11. }  
  12.   
  13. @Override  
  14. public void onCreate(SQLiteDatabase db) {  
  15. db.execSQL("CREATE TABLE IF NOT EXISTS uploadlog (_id integer primary key autoincrement, path varchar(20), sourceid varchar(20))");  
  16. }  
  17.   
  18. @Override  
  19. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  20. // TODO Auto-generated method stub  
  21. }  
  22.   
  23. }  


UpLoadLogService.java


[java]  view plain copy
  1. import java.io.File;  
  2. import android.content.Context;  
  3. import android.database.Cursor;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5.   
  6.   
  7. public class UploadLogService {  
  8. private DBOpenHelper dbOpenHelper;  
  9.   
  10. public UploadLogService(Context context){  
  11. dbOpenHelper = new DBOpenHelper(context);  
  12. }  
  13.   
  14. public String getBindId(File file){  
  15. SQLiteDatabase db = dbOpenHelper.getReadableDatabase();  
  16. Cursor cursor = db.rawQuery("select sourceid from uploadlog where path=?"new String[]{file.getAbsolutePath()});  
  17. if(cursor.moveToFirst()){  
  18. return cursor.getString(0);  
  19. }  
  20. return null;  
  21. }  
  22.   
  23. public void save(String sourceid, File file){  
  24. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  25. db.execSQL("insert into uploadlog(path,sourceid) values(?,?)",   
  26. new Object[]{file.getAbsolutePath(), sourceid});  
  27. }  
  28.   
  29. public void delete(File file){  
  30. SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  31. db.execSQL("delete from uploadlog where path=?"new Object[]{file.getAbsolutePath()});  
  32. }  
  33.  }  

四.多线程断点续传.

MainActivity.java

[java]  view plain copy
  1. import java.io.File;  
  2. import cn.itcast.net.download.DownloadProgressListener;  
  3. import cn.itcast.net.download.FileDownloader;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.os.Environment;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.EditText;  
  12. import android.widget.ProgressBar;  
  13. import android.widget.TextView;  
  14. import android.widget.Toast;  
  15.   
  16.   
  17. public class MainActivity extends Activity {  
  18.     private EditText pathText;  
  19.     private TextView resultView;  
  20.     private Button downloadButton;  
  21.     private Button stopbutton;  
  22.     private ProgressBar progressBar;  
  23.     //hanlder的作用是用于往创建Hander对象所在的线程所绑定的消息队列发送消息  
  24.     private Handler handler = new UIHander();  
  25.       
  26.     private final class UIHander extends Handler{  
  27. public void handleMessage(Message msg) {  
  28. switch (msg.what) {  
  29. case 1:  
  30. int size = msg.getData().getInt("size");  
  31. progressBar.setProgress(size);  
  32. float num = (float)progressBar.getProgress() / (float)progressBar.getMax();  
  33. int result = (int)(num * 100);  
  34. resultView.setText(result+ "%");  
  35. if(progressBar.getProgress() == progressBar.getMax()){  
  36. Toast.makeText(getApplicationContext(), R.string.success, 1).show();  
  37. }  
  38. break;  
  39.   
  40.   
  41. case -1:  
  42. Toast.makeText(getApplicationContext(), R.string.error, 1).show();  
  43. break;  
  44. }  
  45. }  
  46.     }  
  47.       
  48.     @Override  
  49.     public void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.         setContentView(R.layout.main);  
  52.           
  53.         pathText = (EditText) this.findViewById(R.id.path);  
  54.         resultView = (TextView) this.findViewById(R.id.resultView);  
  55.         downloadButton = (Button) this.findViewById(R.id.downloadbutton);  
  56.         stopbutton = (Button) this.findViewById(R.id.stopbutton);  
  57.         progressBar = (ProgressBar) this.findViewById(R.id.progressBar);  
  58.         ButtonClickListener listener = new ButtonClickListener();  
  59.         downloadButton.setOnClickListener(listener);  
  60.         stopbutton.setOnClickListener(listener);  
  61.     }  
  62.       
  63. private final class ButtonClickListener implements View.OnClickListener{  
  64. public void onClick(View v) {  
  65. switch (v.getId()) {  
  66. case R.id.downloadbutton:  
  67. String path = pathText.getText().toString();  
  68. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  69. File saveDir = Environment.getExternalStorageDirectory();  
  70. download(path, saveDir);  
  71. }else{  
  72. Toast.makeText(getApplicationContext(), R.string.sdcarderror, 1).show();  
  73. }  
  74. downloadButton.setEnabled(false);  
  75. stopbutton.setEnabled(true);  
  76. break;  
  77.   
  78.   
  79. case R.id.stopbutton:  
  80. exit();  
  81. downloadButton.setEnabled(true);  
  82. stopbutton.setEnabled(false);  
  83. break;  
  84. }  
  85. }  
  86. /* 
  87. 由于用户的输入事件(点击button, 触摸屏幕....)是由主线程负责处理的,如果主线程处于工作状态, 
  88. 此时用户产生的输入事件如果没能在5秒内得到处理,系统就会报“应用无响应”错误。 
  89. 所以在主线程里不能执行一件比较耗时的工作,否则会因主线程阻塞而无法处理用户的输入事件, 
  90. 导致“应用无响应”错误的出现。耗时的工作应该在子线程里执行。 
  91. */  
  92. private DownloadTask task;  
  93. /** 
  94. * 退出下载 
  95. */  
  96. public void exit(){  
  97. if(task!=null) task.exit();  
  98. }  
  99. private void download(String path, File saveDir) {//运行在主线程  
  100. task = new DownloadTask(path, saveDir);  
  101. new Thread(task).start();  
  102. }  
  103.   
  104.   
  105. /* 
  106. * UI控件画面的重绘(更新)是由主线程负责处理的,如果在子线程中更新UI控件的值,更新后的值不会重绘到屏幕上 
  107. * 一定要在主线程里更新UI控件的值,这样才能在屏幕上显示出来,不能在子线程中更新UI控件的值 
  108. */  
  109. private final class DownloadTask implements Runnable{  
  110. private String path;  
  111. private File saveDir;  
  112. private FileDownloader loader;  
  113. public DownloadTask(String path, File saveDir) {  
  114. this.path = path;  
  115. this.saveDir = saveDir;  
  116. }  
  117. /** 
  118. * 退出下载 
  119. */  
  120. public void exit(){  
  121. if(loader!=null) loader.exit();  
  122. }  
  123.   
  124. public void run() {  
  125. try {  
  126. loader = new FileDownloader(getApplicationContext(), path, saveDir, 3);  
  127. progressBar.setMax(loader.getFileSize());//设置进度条的最大刻度  
  128. loader.download(new DownloadProgressListener() {  
  129. public void onDownloadSize(int size) {  
  130. Message msg = new Message();  
  131. msg.what = 1;  
  132. msg.getData().putInt("size", size);  
  133. handler.sendMessage(msg);  
  134. }  
  135. });  
  136. catch (Exception e) {  
  137. e.printStackTrace();  
  138. handler.sendMessage(handler.obtainMessage(-1));  
  139. }  
  140. }   
  141. }  
  142.     }  
  143.       
  144.       
  145. }  

DBOpenHelper.java

[java]  view plain copy
  1. import android.content.Context;  
  2. import android.database.sqlite.SQLiteDatabase;  
  3. import android.database.sqlite.SQLiteOpenHelper;  
  4.   
  5. public class DBOpenHelper extends SQLiteOpenHelper {  
  6. private static final String DBNAME = "itcast.db";  
  7. private static final int VERSION = 1;  
  8.   
  9. public DBOpenHelper(Context context) {  
  10. super(context, DBNAME, null, VERSION);  
  11. }  
  12.   
  13. @Override  
  14. public void onCreate(SQLiteDatabase db) {  
  15. db.execSQL("CREATE TABLE IF NOT EXISTS filedownlog (id integer primary key autoincrement, downpath varchar(100), threadid INTEGER, downlength INTEGER)");  
  16. }  
  17.   
  18. @Override  
  19. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  20. db.execSQL("DROP TABLE IF EXISTS filedownlog");  
  21. onCreate(db);  
  22. }  
  23. }  


FileService.java


[java]  view plain copy
  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. /** 
  7.  * 业务bean 
  8.  * 
  9.  */  
  10. public class FileService {  
  11. private DBOpenHelper openHelper;  
  12.   
  13.   
  14. public FileService(Context context) {  
  15. openHelper = new DBOpenHelper(context);  
  16. }  
  17. /** 
  18. * 获取每条线程已经下载的文件长度 
  19. * @param path 
  20. * @return 
  21. */  
  22. public Map getData(String path){  
  23. SQLiteDatabase db = openHelper.getReadableDatabase();  
  24. Cursor cursor = db.rawQuery("select threadid, downlength from filedownlog where downpath=?"new String[]{path});  
  25. Map data = new HashMap();  
  26. while(cursor.moveToNext()){  
  27. data.put(cursor.getInt(0), cursor.getInt(1));  
  28. }  
  29. cursor.close();  
  30. db.close();  
  31. return data;  
  32. }  
  33. /** 
  34. * 保存每条线程已经下载的文件长度 
  35. * @param path 
  36. * @param map 
  37. */  
  38. public void save(String path,  Map map){//int threadid, int position  
  39. SQLiteDatabase db = openHelper.getWritableDatabase();  
  40. db.beginTransaction();  
  41. try{  
  42. for(Map.Entry entry : map.entrySet()){  
  43. db.execSQL("insert into filedownlog(downpath, threadid, downlength) values(?,?,?)",  
  44. new Object[]{path, entry.getKey(), entry.getValue()});  
  45. }  
  46. db.setTransactionSuccessful();  
  47. }finally{  
  48. db.endTransaction();  
  49. }  
  50. db.close();  
  51. }  
  52. /** 
  53. * 实时更新每条线程已经下载的文件长度 
  54. * @param path 
  55. * @param map 
  56. */  
  57. public void update(String path, int threadId, int pos){  
  58. SQLiteDatabase db = openHelper.getWritableDatabase();  
  59. db.execSQL("update filedownlog set downlength=? where downpath=? and threadid=?",  
  60. new Object[]{pos, path, threadId});  
  61. db.close();  
  62. }  
  63. /** 
  64. * 当文件下载完成后,删除对应的下载记录 
  65. * @param path 
  66. */  
  67. public void delete(String path){  
  68. SQLiteDatabase db = openHelper.getWritableDatabase();  
  69. db.execSQL("delete from filedownlog where downpath=?"new Object[]{path});  
  70. db.close();  
  71. }  
  72.   
  73. }  


DownloadProgressListener.java

[java]  view plain copy
  1. public interface DownloadProgressListener {  
  2. public void onDownloadSize(int size);  
  3. }  


DownLoadThread.java

[java]  view plain copy
  1. import java.io.File;  
  2. import java.io.InputStream;  
  3. import java.io.RandomAccessFile;  
  4. import java.net.HttpURLConnection;  
  5. import java.net.URL;  
  6. import android.util.Log;  
  7.   
  8. public class DownloadThread extends Thread {  
  9. private static final String TAG = "DownloadThread";  
  10. private File saveFile;  
  11. private URL downUrl;  
  12. private int block;  
  13. /* 下载开始位置  */  
  14. private int threadId = -1;  
  15.   
  16. private int downLength;  
  17. private boolean finish = false;  
  18. private FileDownloader downloader;  
  19.   
  20. public DownloadThread(FileDownloader downloader, URL downUrl, File saveFile, int block, int downLength, int threadId) {  
  21. this.downUrl = downUrl;  
  22. this.saveFile = saveFile;  
  23. this.block = block;  
  24. this.downloader = downloader;  
  25. this.threadId = threadId;  
  26. this.downLength = downLength;  
  27. }  
  28.   
  29. @Override  
  30. public void run() {  
  31. if(downLength < block){//未下载完成  
  32. try {  
  33. HttpURLConnection http = (HttpURLConnection) downUrl.openConnection();  
  34. http.setConnectTimeout(5 * 1000);  
  35. http.setRequestMethod("GET");  
  36. http.setRequestProperty("Accept""image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");  
  37. http.setRequestProperty("Accept-Language""zh-CN");  
  38. http.setRequestProperty("Referer", downUrl.toString());   
  39. http.setRequestProperty("Charset""UTF-8");  
  40. int startPos = block * (threadId - 1) + downLength;//开始位置  
  41. int endPos = block * threadId -1;//结束位置  
  42. http.setRequestProperty("Range""bytes=" + startPos + "-"+ endPos);//设置获取实体数据的范围  
  43. http.setRequestProperty("User-Agent""Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");  
  44. http.setRequestProperty("Connection""Keep-Alive");  
  45.   
  46. InputStream inStream = http.getInputStream();  
  47. byte[] buffer = new byte[1024];  
  48. int offset = 0;  
  49. print("Thread " + this.threadId + " start download from position "+ startPos);  
  50. RandomAccessFile threadfile = new RandomAccessFile(this.saveFile, "rwd");  
  51. threadfile.seek(startPos);  
  52. while (!downloader.getExit() && (offset = inStream.read(buffer, 01024)) != -1) {  
  53. threadfile.write(buffer, 0, offset);  
  54. downLength += offset;  
  55. downloader.update(this.threadId, downLength);  
  56. downloader.append(offset);  
  57. }  
  58. threadfile.close();  
  59. inStream.close();  
  60. print("Thread " + this.threadId + " download finish");  
  61. this.finish = true;  
  62. catch (Exception e) {  
  63. this.downLength = -1;  
  64. print("Thread "this.threadId+ ":"+ e);  
  65. }  
  66. }  
  67. }  
  68. private static void print(String msg){  
  69. Log.i(TAG, msg);  
  70. }  
  71. /**  
  72. * 下载是否完成  
  73. @return  
  74. */  
  75. public boolean isFinish() {  
  76. return finish;  
  77. }  
  78. /** 
  79. * 已经下载的内容大小 
  80. * @return 如果返回值为-1,代表下载失败 
  81. */  
  82. public long getDownLength() {  
  83. return downLength;  
  84. }  
  85. }  

FileDownloader.java

[java]  view plain copy
  1. import java.io.File;  
  2. import java.io.RandomAccessFile;  
  3. import java.net.HttpURLConnection;  
  4. import java.net.URL;  
  5. import java.util.LinkedHashMap;  
  6. import java.util.Map;  
  7. import java.util.UUID;  
  8. import java.util.concurrent.ConcurrentHashMap;  
  9. import java.util.regex.Matcher;  
  10. import java.util.regex.Pattern;  
  11. import cn.itcast.service.FileService;  
  12.   
  13.   
  14. import android.content.Context;  
  15. import android.util.Log;  
  16. /** 
  17.  * 文件下载器 
  18.  *  
  19. try { 
  20. FileDownloader loader = new FileDownloader(context, "http://browse.babasport.com/ejb3/ActivePort.exe", 
  21. new File("D:\\androidsoft\\test"), 2); 
  22. loader.getFileSize();//得到文件总大小 
  23. loader.download(new DownloadProgressListener(){ 
  24. public void onDownloadSize(int size) { 
  25. print("已经下载:"+ size); 
  26.  
  27. }); 
  28. } catch (Exception e) { 
  29. e.printStackTrace(); 
  30. } 
  31.  */  
  32. public class FileDownloader {  
  33. private static final String TAG = "FileDownloader";  
  34. private Context context;  
  35. private FileService fileService;  
  36. /* 停止下载 */  
  37. private boolean exit;  
  38. /* 已下载文件长度 */  
  39. private int downloadSize = 0;  
  40. /* 原始文件长度 */  
  41. private int fileSize = 0;  
  42. /* 线程数 */  
  43. private DownloadThread[] threads;  
  44. /* 本地保存文件 */  
  45. private File saveFile;  
  46. /* 缓存各线程下载的长度*/  
  47. private Map data = new ConcurrentHashMap();  
  48. /* 每条线程下载的长度 */  
  49. private int block;  
  50. /* 下载路径  */  
  51. private String downloadUrl;  
  52. /** 
  53. * 获取线程数 
  54. */  
  55. public int getThreadSize() {  
  56. return threads.length;  
  57. }  
  58. /** 
  59. * 退出下载 
  60. */  
  61. public void exit(){  
  62. this.exit = true;  
  63. }  
  64. public boolean getExit(){  
  65. return this.exit;  
  66. }  
  67. /** 
  68. * 获取文件大小 
  69. * @return 
  70. */  
  71. public int getFileSize() {  
  72. return fileSize;  
  73. }  
  74. /** 
  75. * 累计已下载大小 
  76. * @param size 
  77. */  
  78. protected synchronized void append(int size) {  
  79. downloadSize += size;  
  80. }  
  81. /** 
  82. * 更新指定线程最后下载的位置 
  83. * @param threadId 线程id 
  84. * @param pos 最后下载的位置 
  85. */  
  86. protected synchronized void update(int threadId, int pos) {  
  87. this.data.put(threadId, pos);  
  88. this.fileService.update(this.downloadUrl, threadId, pos);  
  89. }  
  90. /** 
  91. * 构建文件下载器 
  92. * @param downloadUrl 下载路径 
  93. * @param fileSaveDir 文件保存目录 
  94. * @param threadNum 下载线程数 
  95. */  
  96. public FileDownloader(Context context, String downloadUrl, File fileSaveDir, int threadNum) {  
  97. try {  
  98. this.context = context;  
  99. this.downloadUrl = downloadUrl;  
  100. fileService = new FileService(this.context);  
  101. URL url = new URL(this.downloadUrl);  
  102. if(!fileSaveDir.exists()) fileSaveDir.mkdirs();  
  103. this.threads = new DownloadThread[threadNum];  
  104.   
  105. HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  106. conn.setConnectTimeout(5*1000);  
  107. conn.setRequestMethod("GET");  
  108. conn.setRequestProperty("Accept""image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");  
  109. conn.setRequestProperty("Accept-Language""zh-CN");  
  110. conn.setRequestProperty("Referer", downloadUrl);   
  111. conn.setRequestProperty("Charset""UTF-8");  
  112. conn.setRequestProperty("User-Agent""Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");  
  113. conn.setRequestProperty("Connection""Keep-Alive");  
  114. conn.connect();  
  115. printResponseHeader(conn);  
  116. if (conn.getResponseCode()==200) {  
  117. this.fileSize = conn.getContentLength();//根据响应获取文件大小  
  118. if (this.fileSize <= 0throw new RuntimeException("Unkown file size ");  
  119.   
  120. String filename = getFileName(conn);//获取文件名称  
  121. this.saveFile = new File(fileSaveDir, filename);//构建保存文件  
  122. Map logdata = fileService.getData(downloadUrl);//获取下载记录  
  123. if(logdata.size()>0){//如果存在下载记录  
  124. for(Map.Entry entry : logdata.entrySet())  
  125. data.put(entry.getKey(), entry.getValue());//把各条线程已经下载的数据长度放入data中  
  126. }  
  127. if(this.data.size()==this.threads.length){//下面计算所有线程已经下载的数据总长度  
  128. for (int i = 0; i < this.threads.length; i++) {  
  129. this.downloadSize += this.data.get(i+1);  
  130. }  
  131. print("已经下载的长度"this.downloadSize);  
  132. }  
  133. //计算每条线程下载的数据长度  
  134. this.block = (this.fileSize % this.threads.length)==0this.fileSize / this.threads.length : this.fileSize / this.threads.length + 1;  
  135. }else{  
  136. throw new RuntimeException("server no response ");  
  137. }  
  138. catch (Exception e) {  
  139. print(e.toString());  
  140. throw new RuntimeException("don't connection this url");  
  141. }  
  142. }  
  143. /**  
  144. * 获取文件名  
  145. */  
  146. private String getFileName(HttpURLConnection conn) {  
  147. String filename = this.downloadUrl.substring(this.downloadUrl.lastIndexOf('/') + 1);  
  148. if(filename==null || "".equals(filename.trim())){//如果获取不到文件名称  
  149. for (int i = 0;; i++) {  
  150. String mine = conn.getHeaderField(i);  
  151. if (mine == nullbreak;  
  152. if("content-disposition".equals(conn.getHeaderFieldKey(i).toLowerCase())){  
  153. Matcher m = Pattern.compile(".*filename=(.*)").matcher(mine.toLowerCase());  
  154. if(m.find()) return m.group(1);  
  155. }  
  156. }  
  157. filename = UUID.randomUUID()+ ".tmp";//默认取一个文件名  
  158. }  
  159. return filename;  
  160. }  
  161.   
  162. /** 
  163. *  开始下载文件 
  164. * @param listener 监听下载数量的变化,如果不需要了解实时下载的数量,可以设置为null 
  165. * @return 已下载文件大小 
  166. * @throws Exception 
  167. */  
  168. public int download(DownloadProgressListener listener) throws Exception{  
  169. try {  
  170. RandomAccessFile randOut = new RandomAccessFile(this.saveFile, "rw");  
  171. if(this.fileSize>0) randOut.setLength(this.fileSize);  
  172. randOut.close();  
  173. URL url = new URL(this.downloadUrl);  
  174. if(this.data.size() != this.threads.length){//如果原先未曾下载或者原先的下载线程数与现在的线程数不一致  
  175. this.data.clear();  
  176. for (int i = 0; i < this.threads.length; i++) {  
  177. this.data.put(i+10);//初始化每条线程已经下载的数据长度为0  
  178. }  
  179. this.downloadSize = 0;  
  180. }  
  181. for (int i = 0; i < this.threads.length; i++) {//开启线程进行下载  
  182. int downLength = this.data.get(i+1);  
  183. if(downLength < this.block && this.downloadSize<this.fileSize){//判断线程是否已经完成下载,否则继续下载  
  184.   
  185. this.threads[i] = new DownloadThread(this, url, this.saveFile, this.block, this.data.get(i+1), i+1);  
  186. this.threads[i].setPriority(7);  
  187. this.threads[i].start();  
  188. }else{  
  189. this.threads[i] = null;  
  190. }  
  191. }  
  192. fileService.delete(this.downloadUrl);//如果存在下载记录,删除它们,然后重新添加  
  193. fileService.save(this.downloadUrl, this.data);  
  194. boolean notFinish = true;//下载未完成  
  195. while (notFinish) {// 循环判断所有线程是否完成下载  
  196. Thread.sleep(900);  
  197. notFinish = false;//假定全部线程下载完成  
  198. for (int i = 0; i < this.threads.length; i++){  
  199. if (this.threads[i] != null && !this.threads[i].isFinish()) {//如果发现线程未完成下载  
  200. notFinish = true;//设置标志为下载没有完成  
  201. if(this.threads[i].getDownLength() == -1){//如果下载失败,再重新下载  
  202. this.threads[i] = new DownloadThread(this, url, this.saveFile, this.block, this.data.get(i+1), i+1);  
  203. this.threads[i].setPriority(7);  
  204. this.threads[i].start();  
  205. }  
  206. }  
  207. }   
  208. if(listener!=null) listener.onDownloadSize(this.downloadSize);//通知目前已经下载完成的数据长度  
  209. }  
  210. if(downloadSize == this.fileSize) fileService.delete(this.downloadUrl);//下载完成删除记录  
  211. catch (Exception e) {  
  212. print(e.toString());  
  213. throw new Exception("file download error");  
  214. }  
  215. return this.downloadSize;  
  216. }  
  217. /** 
  218. * 获取Http响应头字段 
  219. * @param http 
  220. * @return 
  221. */  
  222. public static Map getHttpResponseHeader(HttpURLConnection http) {  
  223. Map header = new LinkedHashMap();  
  224. for (int i = 0;; i++) {  
  225. String mine = http.getHeaderField(i);  
  226. if (mine == nullbreak;  
  227. header.put(http.getHeaderFieldKey(i), mine);  
  228. }  
  229. return header;  
  230. }  
  231. /** 
  232. * 打印Http头字段 
  233. * @param http 
  234. */  
  235. public static void printResponseHeader(HttpURLConnection http){  
  236. Map header = getHttpResponseHeader(http);  
  237. for(Map.Entry entry : header.entrySet()){  
  238. String key = entry.getKey()!=null ? entry.getKey()+ ":" : "";  
  239. print(key+ entry.getValue());  
  240. }  
  241. }  
  242.   
  243.   
  244. private static void print(String msg){  
  245. Log.i(TAG, msg);  
  246. }  
  247. }  


4.日期转换工具类

package com.mbl.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class FormatDateTime {
    
    /**
     * 日期类操作工具
     */
    public static String formatDateTime(String ymd){
        //格式化当前时间
        java.text.SimpleDateFormat isNow = new java.text.SimpleDateFormat(ymd);
        String now = isNow.format(new java.util.Date());
        return now;
    }
    
    public static String formatDateTime(String ymd, String datetime){
        //格式化当前时间
        java.text.SimpleDateFormat isNow = new java.text.SimpleDateFormat(ymd);
        String now = "";
        try{
            isNow.format(datetime);
        }catch(Exception e){
            e.printStackTrace();
        }
        return now;
    }
    
    /* 比较当前日期和指定日期 return boolean
     * 如果当前日期在指定日期之后返回true否则返回flase
  */
    public static boolean dateCompare(String str){
        boolean bea = false;
        SimpleDateFormat sdf_d = new SimpleDateFormat("yyyy-MM-dd");
        String isDate = sdf_d.format(new java.util.Date());
        java.util.Date date1;
        java.util.Date date0;
        try {
            date1 = sdf_d.parse(str);
            date0= sdf_d.parse(isDate);
            if(date0.after(date1)){ 
                bea = true;
            }
        } catch (ParseException e) {
            bea = false;
        }
        return bea;
    }
    
    
    /*
     * 比较当前月份和指定月份
     * 如果当前月份在指定月份之后返回true否则返回flase
     */
    public static boolean monthCompare(String str){
        boolean bea = false;
        SimpleDateFormat sdf_m = new SimpleDateFormat("yyyy-MM");
        String isMonth = sdf_m.format(new java.util.Date());
        java.util.Date date1;
        java.util.Date date0;
        try {
            date1 = sdf_m.parse(str);
            date0= sdf_m.parse(isMonth);
            if(date0.after(date1)){ 
                bea = true;
            }
        } catch (ParseException e) {
            bea = false;
        }
        return bea;
    }
    
    /* 比较当前日期和指定日期 return boolean
     * 如果当前日期在指定日期之后返回true否则返回flase
    */
    public static boolean secondCompare(String str){
        boolean bea = false;
        SimpleDateFormat sdf_d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String isDate = sdf_d.format(new java.util.Date());
        java.util.Date date1;
        java.util.Date date0;
        try {
            date1 = sdf_d.parse(str);
            date0= sdf_d.parse(isDate);
            if(date0.after(date1)){ 
                bea = true;
            }
        } catch (ParseException e) {
            bea = false;
        }
        return bea;
    }
    

    /**
     * 比较指定两日期如果str1晚于str2则return true;
     * @param str1
     * @param str2
     * @return
     */
    public static boolean secondCompare(String str1, String str2){
        boolean bea = false;
        SimpleDateFormat sdf_d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        java.util.Date date1;
        java.util.Date date0;
        try {
            date1 = sdf_d.parse(str1);
            date0= sdf_d.parse(str2);
            if(date0.after(date1)){ 
                bea = true;
            }
        } catch (ParseException e) {
            bea = false;
        }
        return bea;
    }

    /**
     * 设置间隔数后返回时间
   * @param type 间隔类型 秒或者天
   * @param  间隔数字 比如1秒或者一天
     * @return
     */
    public static String dateAdd(String type, int i){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = formatDateTime("yyyy-MM-dd HH:mm:ss");
        Calendar c = Calendar.getInstance();   // 当时的日期和时间
        if(type.equals("s")){
            int s = c.get(Calendar.SECOND);
            s = s + i;
            c.set(Calendar.SECOND, s);
            str = df.format(c.getTime());
        }
        else if(type.equals("d")){
            int d = c.get(Calendar.DAY_OF_MONTH);  // 取出“日”数
            d = d + i;
            c.set(Calendar.DAY_OF_MONTH, d);       // 将“日”数设置回去
            str = df.format(c.getTime());
        }        
        return str;        
    }
    
   /* test 
    public static void main(String args[]){
        String s1 = FormatDateTime.formatDateTime("yyyy-MM-dd","2005-10-12");
        System.out.println(s1);
    }
   */
    
}


5.Android工具类——处理网络、内存、屏幕等操作

public class CommonUtil {


public static boolean hasSDCard() {


String status = Environment.getExternalStorageState();
return status.equals(Environment.MEDIA_MOUNTED);
}


/**
* 获取最大内存
* 
* @return
*/
public static long getMaxMemory() {


return Runtime.getRuntime().maxMemory() / 1024;
}


/**
* 检查网络
* 
* @param context
* @return
*/
public static boolean checkNetState(Context context) {


boolean netstate = false;
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {


NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {


if (info[i].getState() == NetworkInfo.State.CONNECTED) {


netstate = true;
break;
}
}
}
}
return netstate;
}


public static void showToast(Context context, String tip) {


Toast.makeText(context, tip, Toast.LENGTH_SHORT).show();
}


public static DisplayMetrics metric = new DisplayMetrics();


/**
* 得到屏幕高度
* 
* @param context
* @return
*/
public static int getScreenHeight(Activity context) {


context.getWindowManager().getDefaultDisplay().getMetrics(metric);
return metric.heightPixels;
}


/**
* 得到屏幕宽度
* 
* @param context
* @return
*/
public static int getScreenWidth(Activity context) {


context.getWindowManager().getDefaultDisplay().getMetrics(metric);
return metric.widthPixels;
}


/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/


public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}


/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {


final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}


/**
* 查询手机内非系统应用
* 
* @param context
* @return
*/
public static List getAllApps(Context context) {


List apps = new ArrayList();
PackageManager pManager = context.getPackageManager();
// 获取手机内所有应用
List paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++) {
PackageInfo pak = (PackageInfo) paklist.get(i);
// 判断是否为非系统预装的应用程序
if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
// customs applications
apps.add(pak);
}
}
return apps;
}


public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidth = ((float) width / w);
float scaleHeight = ((float) height / h);
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
return newbmp;
}


/**
* 获取版本号和版本次数
* 
* @param context
* @return
*/
public static String getVersionCode(Context context, int type) {


try {


PackageInfo pi = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
if (type == 1) {


return String.valueOf(pi.versionCode);
} else {


return pi.versionName;
}
} catch (NameNotFoundException e) {


e.printStackTrace();
return null;
}
}


// 通过Service的类名来判断是否启动某个服务
public static boolean messageServiceIsStart(
List mServiceList,
String className) {


for (int i = 0; i < mServiceList.size(); i++) {
if (className.equals(mServiceList.get(i).service.getClassName())) {


return true;
}
}
return false;
}
} 




6.常用工具类库

目前包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、PreferencesUtils、JSONUtils、FileUtils、ResourceUtils、StringUtils、ParcelUtils、RandomUtils、ArrayUtils、ImageUtils、ListUtils、MapUtils、ObjectUtils、SerializeUtils、SystemUtils、TimeUtils。
The English version of this article see:Android Common Utils

所有代码都在TrineaAndroidCommon@Github中,欢迎Star或Fork^_*,除这些工具类外此项目还包括缓存、下拉ListView等。详细接口介绍可见TrineaAndroidCommon API Guide。
具体使用:可直接引入TrineaAndroidCommon作为你项目的library(如何拉取代码及添加公共库),或是自己抽取其中的部分使用。

1、HttpUtils
Http网络工具类,主要包括httpGet、httpPost以及http参数相关方法,以httpGet为例:
static HttpResponse httpGet(HttpRequest request)
static HttpResponse httpGet(java.lang.String httpUrl)
static String httpGetString(String httpUrl)
包含以上三个方法,默认使用gzip压缩,使用bufferedReader提高读取速度。
HttpRequest中可以设置url、timeout、userAgent等其他http参数
HttpResponse中可以获取返回内容、http响应码、http过期时间(Cache-Control的max-age和expires)等
前两个方法可以进行高级参数设置及丰富内容返回,第三个方法可以简单的传入url获取返回内容,httpPost类似。更详细的设置可以直接使用HttpURLConnection或apache的HttpClient。
源码可见HttpUtils.java,更多方法及更详细参数介绍可见HttpUtils Api Guide。

2、DownloadManagerPro
Android系统下载管理DownloadManager增强方法,可用于包括获取下载相关信息,如:
getStatusById(long) 得到下载状态
getDownloadBytes(long) 得到下载进度信息
getBytesAndStatus(long) 得到下载进度信息和状态
getFileName(long) 得到下载文件路径
getUri(long) 得到下载uri
getReason(long) 得到下载失败或暂停原因
getPausedReason(long) 得到下载暂停原因
getErrorCode(long) 得到下载错误码
源码可见DownloadManagerPro.java,更多方法及更详细参数介绍可见DownloadManagerPro Api Guide。关于Android DownManager使用可见DownManager Demo。

3、ShellUtils
Android Shell工具类,可用于检查系统root权限,并在shell或root用户下执行shell命令。如:
checkRootPermission() 检查root权限
execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) shell环境执行命令,第二个参数表示是否root权限执行
execCommand(String command, boolean isRoot) shell环境执行命令
源码可见ShellUtils.java,更多方法及更详细参数介绍可见ShellUtils Api Guide。关于静默安装可见apk-root权限静默安装。

4、PackageUtils
Android包相关工具类,可用于(root)安装应用、(root)卸载应用、判断是否系统应用等,如:
install(Context, String) 安装应用,如果是系统应用或已经root,则静默安装,否则一般安装
uninstall(Context, String) 卸载应用,如果是系统应用或已经root,则静默卸载,否则一般卸载
isSystemApplication(Context, String) 判断应用是否为系统应用
源码可见PackageUtils.java,更多方法及更详细参数介绍可见ShellUtils Api Guide。关于静默安装可见apk-root权限静默安装。

5、PreferencesUtils
Android SharedPreferences相关工具类,可用于方便的向SharedPreferences中读取和写入相关类型数据,如:
putString(Context, String, String) 保存string类型数据
putInt(Context, String, int) 保存int类型数据
getString(Context, String) 获取string类型数据
getInt(Context, String) 获取int类型数据
可通过修改PREFERENCE_NAME变量修改preference name
源码可见PreferencesUtils.java,更多方法及更详细参数介绍可见PreferencesUtils Api Guide。

6、JSONUtils
JSONUtils工具类,可用于方便的向Json中读取和写入相关类型数据,如:
String getString(JSONObject jsonObject, String key, String defaultValue) 得到string类型value
String getString(String jsonData, String key, String defaultValue) 得到string类型value
表示从json中读取某个String类型key的值

getMap(JSONObject jsonObject, String key) 得到map
getMap(String jsonData, String key) 得到map
表示从json中读取某个Map类型key的值
源码可见JSONUtils.java,更多方法及更详细参数介绍可见JSONUtils Api Guide。

7、FileUtils
文件工具类,可用于读写文件及对文件进行操作。如:
readFile(String filePath) 读文件
writeFile(String filePath, String content, boolean append) 写文件
getFileSize(String path) 得到文件大小
deleteFile(String path) 删除文件
源码可见FileUtils.java,更多方法及更详细参数介绍可见FileUtils Api Guide。

8、ResourceUtils
Android Resource工具类,可用于从android资源目录的raw和assets目录读取内容,如:
geFileFromAssets(Context context, String fileName) 得到assets目录下某个文件内容
geFileFromRaw(Context context, int resId) 得到raw目录下某个文件内容
源码可见ResourceUtils.java,更多方法及更详细参数介绍可见ResourceUtils Api Guide。

9、StringUtils
String工具类,可用于常见字符串操作,如:
isEmpty(String str) 判断字符串是否为空或长度为0
isBlank(String str) 判断字符串是否为空或长度为0 或由空格组成
utf8Encode(String str) 以utf-8格式编码
capitalizeFirstLetter(String str) 首字母大写
源码可见StringUtils.java,更多方法及更详细参数介绍可见StringUtils Api Guide。

10、ParcelUtils
Android Parcel工具类,可用于从parcel读取或写入特殊类型数据,如:
readBoolean(Parcel in) 从pacel中读取boolean类型数据
readHashMap(Parcel in, ClassLoader loader) 从pacel中读取map类型数据
writeBoolean(boolean b, Parcel out) 向parcel中写入boolean类型数据
writeHashMap(Map map, Parcel out, int flags) 向parcel中写入map类型数据
源码可见ParcelUtils.java,更多方法及更详细参数介绍可见ParcelUtils Api Guide。

11、RandomUtils
随机数工具类,可用于获取固定大小固定字符内的随机数,如:
getRandom(char[] sourceChar, int length) 生成随机字符串,所有字符均在某个字符串内
getRandomNumbers(int length) 生成随机数字
源码可见RandomUtils.java,更多方法及更详细参数介绍可见RandomUtils Api Guide。

12、ArrayUtils
数组工具类,可用于数组常用操作,如:
isEmpty(V[] sourceArray) 判断数组是否为空或长度为0
getLast(V[] sourceArray, V value, V defaultValue, boolean isCircle) 得到数组中某个元素前一个元素,isCircle表示是否循环
getNext(V[] sourceArray, V value, V defaultValue, boolean isCircle) 得到数组中某个元素下一个元素,isCircle表示是否循环
源码可见ArrayUtils.java,更多方法及更详细参数介绍可见ArrayUtils Api Guide。

13、ImageUtils
图片工具类,可用于Bitmap, byte array, Drawable之间进行转换以及图片缩放,目前功能薄弱,后面会进行增强。如:
bitmapToDrawable(Bitmap b) bimap转换为drawable
drawableToBitmap(Drawable d) drawable转换为bitmap
drawableToByte(Drawable d) drawable转换为byte
scaleImage(Bitmap org, float scaleWidth, float scaleHeight) 缩放图片
源码可见ImageUtils.java,更多方法及更详细参数介绍可见ImageUtils Api Guide。

14、ListUtils
List工具类,可用于List常用操作,如:
isEmpty(List sourceList) 判断List是否为空或长度为0
join(List list, String separator) List转换为字符串,并以固定分隔符分割
addDistinctEntry(List sourceList, V entry) 向list中添加不重复元素
源码可见ListUtils.java,更多方法及更详细参数介绍可见ListUtils Api Guide。

15、MapUtils
Map工具类,可用于Map常用操作,如:
isEmpty(Map sourceMap) 判断map是否为空或长度为0
parseKeyAndValueToMap(String source, String keyAndValueSeparator, String keyAndValuePairSeparator, boolean ignoreSpace) 字符串解析为map
toJson(Map map) map转换为json格式
源码可见MapUtils.java,更多方法及更详细参数介绍可见MapUtils Api Guide。

16、ObjectUtils
Object工具类,可用于Object常用操作,如:
isEquals(Object actual, Object expected) 比较两个对象是否相等
compare(V v1, V v2) 比较两个对象大小
transformIntArray(int[] source)  Integer 数组转换为int数组
源码可见ObjectUtils.java,更多方法及更详细参数介绍可见ObjectUtils Api Guide。

17、SerializeUtils
序列化工具类,可用于序列化对象到文件或从文件反序列化对象,如:
deserialization(String filePath) 从文件反序列化对象
serialization(String filePath, Object obj) 序列化对象到文件
源码可见SerializeUtils.java,更多方法及更详细参数介绍可见SerializeUtils Api Guide。

18、SystemUtils
系统信息工具类,可用于得到线程池合适的大小,目前功能薄弱,后面会进行增强。如:
getDefaultThreadPoolSize() 得到跟系统配置相符的线程池大小
源码可见SystemUtils.java,更多方法及更详细参数介绍可见SystemUtils Api Guide。

19、TimeUtils
时间工具类,可用于时间相关操作,如:
getCurrentTimeInLong() 得到当前时间
getTime(long timeInMillis, SimpleDateFormat dateFormat) 将long转换为固定格式时间字符串
源码可见TimeUtils.java,更多方法及更详细参数介绍可见TimeUtils Api Guide。



7.Apache dbUtils应用实例

前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看。大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用的Hibernate与Mybatis。当然如果人们要一个纯粹的封装了JDBC的工具类,使用Apache Common DbUtils(下面简称ACD)是个不错的选择,这个工具在JDBC的基础上稍加封装是JDBC的操作更加便捷,在学习使用这个框架的途中你也不需要学 习太多的API类,因为一共也才3个部分(3个包)。
  1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)

  2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)

  3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)

使用这个DbUtils的一些优势:

  1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。

  2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码能够清晰简洁的表达你的操作目的。

  3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的Bean实体。    

要学习如何使用这个框架,最简单的方式就是用它写个Demo-CRUD操作,让我们先做个准备动作在Mysql中建立一个测试专用表Visitor。

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
/*创建Visitor*/  
CREATE TABLE Visitor  
(  
    Id INT(11) NOT NULL AUTO_INCREMENT,  
    Name VARCHAR(1000) NOT NULL,  
    Email VARCHAR(1000) NOT NULL,  
    Status INT NOT NULL DEFAULT 1,  
    CreateTime DateTime,  
    PRIMARY KEY(Id)  
)  

建完表结构,我们就可以学习怎么利用框架中的Utils类帮助我们完成CRUD-DEMO,其实对于这个框架主要操作的是ResultSetHandler接口的实现类与QueryRunner类

创建对应的JavaBean实体类如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
package david.apache.model;  
  
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
public class Visitor {  
      
    private int id;  
    private String name;  
    private String email;  
    private int status;  
    private Date createTime;  
  
    public Visitor() {  
        // TODO Auto-generated constructor stub  
        setCreateTime(new Date());  
    }  
  
    public Visitor(String name, String email) {  
        this.setName(name);  
        this.setEmail(email);  
        this.setStatus(1);  
        this.setCreateTime(new Date());  
    }  
  
    public int getId() {  
        return id;  
    }  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getEmail() {  
        return email;  
    }  
  
    public void setEmail(String email) {  
        this.email = email;  
    }  
  
    public int getStatus() {  
        return status;  
    }  
  
    public void setStatus(int status) {  
        this.status = status;  
    }  
  
    public Date getCreateTime() {  
        return createTime;  
    }  
  
    public void setCreateTime(Date createTime) {  
        this.createTime = createTime;  
    }  
      
    @Override  
    public String toString() {  
        // TODO Auto-generated method stub  
        return String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(),  
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime()));  
    }  
}  

首先我们先新建一个获取Connection的方法:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
private static Connection getConnection() {  
    Connection conn = null;  
    try {  
        Class.forName(CONNECTION_DRIVER_STR);  
        conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456");  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return conn;  
}  

新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用select last_insert_id()方法)
[java] view plaincopy在CODE上查看代码片派生到我的代码片
/* 
 * 新增Visitor, ScalarHandler的demo 
 */  
public static void insertVisitor(Visitor visitor) {  
    Connection conn = getConnection();  
    QueryRunner qr = new QueryRunner();  
    String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";  
    try {  
        int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date());  
        BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler(1));  
        visitor.setId(Integer.valueOf(String.valueOf(newId)));  
        System.out.println("新增" + count + "条数据=>Id:" + newId);  
    } catch (SQLException e) {  
        e.printStackTrace();  
    }  
}  

大家可以看到操作的步骤其实很简单,也是写SQL可以了,对于自增字段我们通过select last_insert_id()的方法利用ScalarHandler实体类来返回达到变通效果。

删除方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static void deleteVisitor(int id) {  
    Connection conn = getConnection();  
    QueryRunner qr = new QueryRunner();  
    String sql = "delete from visitor where status>0 and id=?";  
    try {  
        int count = qr.update(conn, sql, id);  
        System.out.println("删除" + count + "条数据。");  
    } catch (SQLException e) {  
        // TODO: handle exception  
        e.printStackTrace();  
    }  
}  

查询方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static Visitor retrieveVisitor(int id) {  
    Connection conn = getConnection();  
    Visitor visitor = null;  
    QueryRunner qr = new QueryRunner();  
    String sql = "select * from visitor where status>0 and id=?";          
    try {  
        visitor = (Visitor) qr.query(conn, sql, new BeanHandler(Visitor.class), id);  
        System.out.println(visitor);  
        return visitor;  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return visitor;  
}  

更新操作
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static void updateVisitor(int id) {  
    Visitor visitor = retrieveVisitor(id);  
    System.out.println("更新前:" + visitor);  
    Connection conn = getConnection();  
    String updateFieldStr = visitor.getName();  
    QueryRunner qr = new QueryRunner();  
    String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";  
    if (updateFieldStr.contains("updated")) {  
        updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));  
    } else {  
        updateFieldStr = updateFieldStr + "updated";  
    }  
    visitor.setName(updateFieldStr);  
    try {  
        int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(),  
                visitor.getCreateTime(), visitor.getId() });  
        System.out.println("更新了" + count + "条数据");  
        System.out.println("更新后:" + visitor);  
    } catch (SQLException e) {  
        // TODO: handle exception  
        e.printStackTrace();  
    }  
}  

BeanListHandler方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static void getVisitorList() {  
    Connection conn = getConnection();  
    QueryRunner qr = new QueryRunner();  
    String sql = "select * from visitor where status>0";  
    try {  
        List ls = qr.query(conn, sql, new BeanListHandler(Visitor.class));  
        for (Visitor visitor : ls) {  
            System.out.println(visitor);  
        }  
    } catch (SQLException e) {  
        // TODO Auto-generated catch block  
        e.printStackTrace();  
    }  
}  

MapHandler操作
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static void getVisitWithMap(int id) {  
    Connection conn = getConnection();  
    QueryRunner qr = new QueryRunner();  
    String sql = "select * from visitor where status>0 and id=?";  
    try {  
        Map map = qr.query(conn, sql, new MapHandler(), id);  
        Integer visitorId = Integer.valueOf(map.get("Id").toString());  
        String visitorName = map.get("Name").toString();  
        String visitorEmail = map.get("Email").toString();  
        Integer visitorStatus = Integer.valueOf(map.get("Status").toString());  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());  
        Visitor visitor = new Visitor(visitorName, visitorEmail);  
        visitor.setId(visitorId);  
        visitor.setStatus(visitorStatus);  
        visitor.setCreateTime(visitorCreateTime);  
        System.out.println(visitor);  
    } catch (Exception e) {  
        // TODO: handle exception  
        e.printStackTrace();  
    }  
}  

MapListHandler方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public static void getVisitWithMapLs() {  
        Connection conn = getConnection();  
        QueryRunner qr = new QueryRunner();  
        String sql = "select * from visitor where status>0";  
        try {  
            List> mapLs = qr.query(conn, sql, new MapListHandler());  
            for (Map map : mapLs) {  
                Integer visitorId = Integer.valueOf(map.get("Id").toString());  
                String visitorName = map.get("Name").toString();  
                String visitorEmail = map.get("Email").toString();  
                Integer visitorStatus = Integer.valueOf(map.get("Status").toString());  
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());  
                Visitor visitor = new Visitor(visitorName, visitorEmail);  
                visitor.setId(visitorId);  
                visitor.setStatus(visitorStatus);  
                visitor.setCreateTime(visitorCreateTime);  
                System.out.println(visitor);  
            }  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
    }  


8. Android异步加载数据的三种实现

[java]  view plain copy
  1. package com.testasyntextview;  
  2. /** 
  3.  * 把获取的线程写到方法中(比较好) 
  4.  */  
  5. import android.app.Activity;  
  6. import android.app.ProgressDialog;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11. import android.text.Html;  
  12. import android.text.Spanned;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17.   
  18.   
  19. public class MethodTestAsynTextViewActivity extends Activity {  
  20.     private TextView textView1;  
  21.     private Button button1;  
  22.     private Context context;  
  23.     private ProgressDialog progressDialog;  
  24.     private Spanned html;  
  25.   
  26.   
  27.     /** Called when the activity is first created. */  
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.         context = this;  
  33.         textView1 = (TextView) findViewById(R.id.textView1);  
  34.         button1 = (Button) findViewById(R.id.button1);  
  35.         button1.setOnClickListener(l);  
  36.   
  37.   
  38.     }  
  39.   
  40.   
  41.     private OnClickListener l = new OnClickListener() {  
  42.   
  43.   
  44.         @Override  
  45.         public void onClick(View v) {  
  46.   
  47.   
  48.             progressDialog = ProgressDialog.show(context, "获取数据中""等待");  
  49.             getHtmlDate();  
  50.   
  51.   
  52.         }  
  53.     };  
  54.   
  55.   
  56.     private void getHtmlDate() {// 获取数据,把线程写入了其中  
  57.         new Thread() {  
  58.             public void run() {  
  59.                 Message msg = myHandler.obtainMessage();  
  60.                 try {  
  61.                     html = HttpUtil.fromHtml(HttpUtil  
  62.                             .getHtml("http://wap.sina.com"));  
  63.                     msg.what = 0;  
  64.                 } catch (Exception e) {  
  65.                     e.printStackTrace();  
  66.                     msg.what = 1;  
  67.                 }  
  68.   
  69.   
  70.                 myHandler.sendMessage(msg);  
  71.             }  
  72.         }.start();  
  73.     }  
  74.   
  75.   
  76.     Handler myHandler = new Handler() {  
  77.   
  78.   
  79.         public void handleMessage(Message msg) {  
  80.             switch (msg.what) {  
  81.             case 0:  
  82.                 textView1.setText(html);  
  83.                 progressDialog.dismiss();  
  84.                 break;  
  85.             case 1:  
  86.                 textView1.setText("当前无数据");  
  87.                 progressDialog.dismiss();  
  88.                 break;  
  89.             }  
  90.             super.handleMessage(msg);  
  91.         }  
  92.     };  
  93.   
  94.   
  95. }  
[java]  view plain copy
  1. "code" class="java">package com.testasyntextview;  
  2.   
  3. /** 
  4.  * 使用AsyncTask类 
  5.  */  
  6. import android.app.Activity;  
  7. import android.app.ProgressDialog;  
  8. import android.content.Context;  
  9. import android.os.AsyncTask;  
  10. import android.os.Bundle;  
  11. import android.os.Handler;  
  12. import android.os.Message;  
  13. import android.text.Html;  
  14. import android.text.Spanned;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.TextView;  
  20.   
  21. public class TestAsynTextViewActivity extends Activity {  
  22.     private TextView textView1;  
  23.     private Button button1;  
  24.     private Context context;  
  25.     private ProgressDialog progressDialog;  
  26.     private Spanned html;  
  27.   
  28.     /** Called when the activity is first created. */  
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.main);  
  33.         context = this;  
  34.   
  35.         progressDialog = new ProgressDialog(context);  
  36.         progressDialog.setTitle("进度条");  
  37.         progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  38.   
  39.         textView1 = (TextView) findViewById(R.id.textView1);  
  40.         button1 = (Button) findViewById(R.id.button1);  
  41.         button1.setOnClickListener(l);  
  42.   
  43.     }  
  44.   
  45.     private OnClickListener l = new OnClickListener() {  
  46.   
  47.         @Override  
  48.         public void onClick(View v) {  
  49.             new InitTask().execute("http://wap.sina.com",  
  50.                     "http://wap.baidu.com");  
  51.   
  52.         }  
  53.     };  
  54.   
  55.     private void getHtmlDate(String url) {// 获取数据,把线程写入了其中  
  56.   
  57.         try {  
  58.             html = HttpUtil.fromHtml(HttpUtil.getHtml(url));  
  59.         } catch (Exception e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.   
  63.     }  
  64.   
  65.     /** 
  66.      * When an asynchronous task is executed, the task goes through 4 steps: 
  67.      *  
  68.      * onPreExecute(),  
  69.      * invoked on the UI thread immediately after the task is 
  70.      * executed. This step is normally used to setup the task, for instance by 
  71.      * showing a progress bar in the user interface.  
  72.      *  
  73.      * doInBackground(Params...), 
  74.      * invoked on the background thread immediately after onPreExecute() 
  75.      * finishes executing. This step is used to perform background computation 
  76.      * that can take a long time. The parameters of the asynchronous task are 
  77.      * passed to this step. The result of the computation must be returned by 
  78.      * this step and will be passed back to the last step. This step can also 
  79.      * use  
  80.      *  
  81.      * publishProgress(Progress...) to publish one or more units of 
  82.      * progress. These values are published on the UI thread, in the 
  83.      *  
  84.      * onProgressUpdate(Progress...) step. onProgressUpdate(Progress...), 
  85.      * invoked on the UI thread after a call to publishProgress(Progress...). 
  86.      * The timing of the execution is undefined. This method is used to display 
  87.      * any form of progress in the user interface while the background 
  88.      * computation is still executing. For instance, it can be used to animate a 
  89.      * progress bar or show logs in a text field. onPostExecute(Result), invoked 
  90.      * on the UI thread after the background computation finishes. The result of 
  91.      * the background computation is passed to this step as a parameter. 
  92.      */  
  93.   
  94.     class InitTask extends AsyncTask {  
  95.         protected void onPreExecute() {  
  96.             progressDialog.show();  
  97.             super.onPreExecute();  
  98.   
  99.         }  
  100.   
  101.         protected Long doInBackground(String... params) {// Long是结果 String 是入口参数  
  102.   
  103.             getHtmlDate(params[0]);// 可以运行两个任务  
  104.             publishProgress(50);// 发送进度50%  
  105.             getHtmlDate(params[1]);  
  106.             publishProgress(100);// 发送进度100%  
  107.   
  108.             return (long1;  
  109.   
  110.         }  
  111.   
  112.         @Override  
  113.         protected void onProgressUpdate(Integer... progress) {  
  114.   
  115.             progressDialog.setProgress(progress[0]);// 设置进度  
  116.             super.onProgressUpdate(progress);  
  117.             Log.e("测试", progress[0] + "");  
  118.   
  119.         }  
  120.   
  121.         @Override  
  122.         protected void onPostExecute(Long result) {  
  123.   
  124.             setTitle(result + "测试");  
  125.             textView1.setText(html);  
  126.             progressDialog.dismiss();  
  127.   
  128.             super.onPostExecute(result);  
  129.   
  130.         }  
  131.   
  132.     }  
  133.   
  134. }"code" class="java">  
  135.   

  136.   

  137.   
  138. "code"
     class="html">package com.testasyntextview;  
  139. /** 
  140.  * 使用Runable 
  141.  */  
  142. import android.app.Activity;  
  143. import android.app.ProgressDialog;  
  144. import android.content.Context;  
  145. import android.os.Bundle;  
  146. import android.os.Handler;  
  147. import android.os.Message;  
  148. import android.text.Html;  
  149. import android.text.Spanned;  
  150. import android.view.View;  
  151. import android.view.View.OnClickListener;  
  152. import android.widget.Button;  
  153. import android.widget.TextView;  
  154.   
  155. public class RunableTestAsynTextViewActivity extends Activity {  
  156.     private TextView textView1;  
  157.     private Button button1;  
  158.     private Context context;  
  159.     private ProgressDialog progressDialog;  
  160.     private Spanned html;  
  161.   
  162.     /** Called when the activity is first created. */  
  163.     @Override  
  164.     public void onCreate(Bundle savedInstanceState) {  
  165.         super.onCreate(savedInstanceState);  
  166.         setContentView(R.layout.main);  
  167.         context = this;  
  168.         textView1 = (TextView) findViewById(R.id.textView1);  
  169.         button1 = (Button) findViewById(R.id.button1);  
  170.         button1.setOnClickListener(l);  
  171.   
  172.     }  
  173.   
  174.     private OnClickListener l = new OnClickListener() {  
  175.   
  176.         @Override  
  177.         public void onClick(View v) {  
  178.   
  179.             progressDialog = ProgressDialog.show(context, "获取数据中""等待");  
  180.             new Thread(new ThreadDemo()).start();  
  181.   
  182.         }  
  183.     };  
  184.   
  185.     private void getHtmlDate() {  
  186.         try {  
  187.             html = HttpUtil.fromHtml(HttpUtil.getHtml("http://wap.sina.com"));  
  188.         } catch (Exception e) {  
  189.             e.printStackTrace();  
  190.         }  
  191.   
  192.     }  
  193.   
  194.     class ThreadDemo implements Runnable {//一个runable  
  195.         public void run() {  
  196.             getHtmlDate();  
  197.             myHandler.sendEmptyMessage(0);  
  198.         }  
  199.     }  
  200.   
  201.     Handler myHandler = new Handler() {  
  202.   
  203.         public void handleMessage(Message msg) {  
  204.             switch (msg.what) {  
  205.             case 0:  
  206.                 textView1.setText(html);  
  207.                 progressDialog.dismiss();  
  208.                 break;  
  209.             case 1:  
  210.                 textView1.setText("当前无数据");  
  211.                 progressDialog.dismiss();  
  212.                 break;  
  213.             }  
  214.             super.handleMessage(msg);  
  215.         }  
  216.     };  
  217.   
  218. }  
  219.   

  220.   

  221.   
  222. "code"
     class="java">package com.testasyntextview;  
  223.   
  224. import java.io.ByteArrayOutputStream;  
  225. import java.io.InputStream;  
  226. import java.net.HttpURLConnection;  
  227. import java.net.URL;  
  228.   
  229. import android.graphics.drawable.Drawable;  
  230. import android.text.Html;  
  231. import android.text.Spanned;  
  232.   
  233. public class HttpUtil {  
  234.     public static String getHtml(String path) throws Exception {  
  235.         URL url = new URL(path);  
  236.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  237.         conn.setRequestMethod("GET");  
  238.         conn.setConnectTimeout(5 * 1000);  
  239.         InputStream inStream = conn.getInputStream();// 通过输入流获取html数据  
  240.         byte[] data = readInputStream(inStream);// 得到html的二进制数据  
  241.         String html = new String(data, "utf-8");  
  242.         return html;  
  243.     }  
  244.   
  245.     public static byte[] readInputStream(InputStream inStream) throws Exception {  
  246.         ByteArrayOutputStream outStream = new ByteArrayOutputStream();  
  247.         byte[] buffer = new byte[1024];  
  248.         int len = 0;  
  249.         while ((len = inStream.read(buffer)) != -1) {  
  250.             outStream.write(buffer, 0, len);  
  251.         }  
  252.         inStream.close();  
  253.         return outStream.toByteArray();  
  254.     }  
  255.   
  256.     public static Spanned fromHtml(String html) {  
  257.         Spanned sp = Html.fromHtml(html, new Html.ImageGetter() {  
  258.             @Override  
  259.             public Drawable getDrawable(String source) {  
  260.                 InputStream is = null;  
  261.                 try {  
  262.                     is = (InputStream) new URL(source).getContent();  
  263.                     Drawable d = Drawable.createFromStream(is, "src");  
  264.                     d.setBounds(00, d.getIntrinsicWidth(),  
  265.                             d.getIntrinsicHeight());  
  266.                     is.close();  
  267.                     return d;  
  268.                 } catch (Exception e) {  
  269.                     return null;  
  270.                 }  
  271.             }  
  272.         }, null);  
  273.         return sp;  
  274.   
  275.     }  
  276. }  

  277.   

  278.   
  279.   

  280.   

  281.   

  282.  



你可能感兴趣的:(Android开发详解,Android工具类集合)