編輯:關於Android編程
vc7EvP607c7zCgo8YnI+CgoKcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX1NVQ0NFU1MgPSAxOwpwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX1NVQ0NFU1MgPSAyOwpwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQUNLVVBfRVJST1IgPSAzOwpwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNUT1JFX05PRklMRUVSUk9SID0gNDsKPGJyPgoK0tS8sLao0uXBvbj2w/zB7qO6IMr9vt2/4rG4t93D/MHuoaLK/b7dv+K71ri0w/zB7go8YnI+CgoKcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9CQUNLVVAgPSA="backupDatabase";
public static final String COMMAND_RESTORE = "restoreDatabase";
package activitys; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import android.app.Activity; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.widget.Toast; class BackupTask extends AsyncTask{ public interface CompletionListener { void onBackupComplete(); void onRestoreComplete(); void onError(int errorCode); } public static final int BACKUP_SUCCESS = 1; public static final int RESTORE_SUCCESS = 2; public static final int BACKUP_ERROR = 3; public static final int RESTORE_NOFILEERROR = 4; public static final String COMMAND_BACKUP = "backupDatabase"; public static final String COMMAND_RESTORE = "restoreDatabase"; private Context mContext; private CompletionListener listener; public BackupTask(Context context) { super(); mContext = context; } public void setCompletionListener(CompletionListener aListener) { listener = aListener; } @Override protected Integer doInBackground(String... params) { File dbFile = mContext.getDatabasePath("mydb"); File exportDir = new File(Environment.getExternalStorageDirectory(), "myAppBackups"); if (!exportDir.exists()) { exportDir.mkdirs(); } File backup = new File(exportDir, dbFile.getName()); String command = params[0]; if (command.equals(COMMAND_BACKUP)) { try { backup.createNewFile(); fileCopy(dbFile, backup); return BACKUP_SUCCESS; } catch (IOException e) { return BACKUP_ERROR; } } else if (command.equals(COMMAND_RESTORE)) { try { if (!backup.exists()) { return RESTORE_NOFILEERROR; } dbFile.createNewFile(); fileCopy(backup, dbFile); return RESTORE_SUCCESS; } catch (IOException e) { return BACKUP_ERROR; } } else { return BACKUP_ERROR; } } @Override protected void onPostExecute(Integer result) { switch (result) { case BACKUP_SUCCESS: if (listener != null) { listener.onBackupComplete(); } break; case RESTORE_SUCCESS: if (listener != null) { listener.onRestoreComplete(); } break; case RESTORE_NOFILEERROR: if (listener != null) { listener.onError(RESTORE_NOFILEERROR); } break; default: if (listener != null) { listener.onError(BACKUP_ERROR); } } } private void fileCopy(File source, File dest) throws IOException { FileChannel inChannel = new FileInputStream(source).getChannel(); FileChannel outChannel = new FileOutputStream(dest).getChannel(); try { inChannel.transferTo(0, inChannel.size(), outChannel); } finally { if (inChannel != null) inChannel.close(); if (outChannel != null) outChannel.close(); } } }
package activitys;
import com.example.design_activitys.R;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;
public class BackupActivity extends Activity implements BackupTask.CompletionListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SQLiteDatabase db = openOrCreateDatabase("mydb", Activity.MODE_PRIVATE,
null);
db.close();
}
@Override
public void onResume() {
super.onResume();
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
BackupTask task = new BackupTask(this);
task.setCompletionListener(this);
task.execute(BackupTask.COMMAND_RESTORE);
}
}
@Override
public void onPause() {
super.onPause();
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
BackupTask task = new BackupTask(this);
task.execute(BackupTask.COMMAND_BACKUP);
}
}
@Override
public void onBackupComplete() {
Toast.makeText(this, "Backup Successful", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(int errorCode) {
if (errorCode == BackupTask.RESTORE_NOFILEERROR) {
Toast.makeText(this, "No Backup to Restore", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "Error: " + errorCode, Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onRestoreComplete() {
Toast.makeText(this, "Restore Successful", Toast.LENGTH_SHORT).show();
}
}private class DownloadFilesTask extends AsyncTask{ protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
實現AsyncTask中定義的下面一個或幾個方法:
* onPreExecute(), 該方法將在執行實際的後台操作前被UI 線程調用。可以在該方法中做一些准備工 作,如在界面上顯示一個進度條,或者一些控件的實例化,這個方法可以不用實現。
* doInBackground(Params...), 將在onPreExecute 方法執行後馬上執行,該方法運行在後台線程中。這裡將主要負責執行那些很耗時的後台處理工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
* onProgressUpdate(Progress...),在publishProgress方法被調用後,UI 線程將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
* onPostExecute(Result), 在doInBackground 執行完成後,onPostExecute 方法將被UI 線程調用,後台的計算結果將通過該方法傳遞到UI 線程,並且在界面上展示給用戶.
* onCancelled(),在用戶取消線程操作的時候調用。在主線程中調用onCancelled()的時候調用。
為了正確的使用AsyncTask類,以下是幾條必須遵守的准則:
1) Task的實例必須在UI 線程中創建
2) execute方法必須在UI 線程中調用
3) 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)這幾個方法,需要在UI線程中實例化這個task來調用。
4) 該task只能被執行一次,否則多次調用時將會出現異常
doInBackground方法和onPostExecute的參數必須對應,這兩個參數在AsyncTask聲明的泛型參數列表中指定,第一個為 doInBackground接受的參數,第二個為顯示進度的參數,第第三個為doInBackground返回和onPostExecute傳入的參 數。
//AsyncTask<>的參數類型由用戶設定,這裡設為三個String
//第一個String代表輸入到任務的參數類型,也即是doInBackground()的參數類型
//第二個String代表處理過程中的參數類型,也就是doInBackground()執行過程中的產出參數類型,通過publishProgress()發消息
//傳遞給onProgressUpdate()一般用來更新界面
//第三個String代表任務結束的產出類型,也就是doInBackground()的返回值類型,和onPostExecute()的參數類型
private class task extends AsyncTask
AsyncTask 的執行分為四個步驟,每一步都對應一個回調方法,需要注意的是這些方法不應該由應用程序調用,開發者需要做的就是實現這些方法。在任務的執行過程中,這些方法被自動調用。
* onPreExecute() 當任務執行之前開始調用此方法,可以在這裡顯示進度對話框。
* doInBackground(Params...) 此方法在後台線程 執行,完成任務的主要工作,通常需要較長的時間。在執行過程中可以調用publicProgress(Progress...)來更新任務的進度。
* onProgressUpdate(Progress...) 此方法在主線程 執行,用於顯示任務執行的進度。
* onPostExecute(Result) 此方法在主線程 執行,任務執行的結果作為此方法的參數返回
優勢:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* FileChannel的基本使用。
*/
public class AcquireChannel {
public static void main(String[] args) throws Exception {
// 根據FileOutputStream獲得通道FileChannel
FileChannel channel = new FileOutputStream("D:/a.txt").getChannel();
// 字節方式寫入
channel.write(ByteBuffer.wrap("hello, NIO world in java!".getBytes()));
channel.close();
// 根據FileInputStream獲得通道FileChannel
channel = new FileInputStream("D:/a.txt").getChannel();
// ByteBuffer分配空間,16個字節
// 這裡需要知道 byte是1字節, short和char是2字節,int和float是4字節
// long和double是8字節 1byte=8bit 。 基本只是還是必須記住的。
ByteBuffer buff = ByteBuffer.allocate(16);
// 字節數組數據裝入buff,
channel.read(buff);
// 反轉此緩沖區
buff.flip();
// 逐個輸出,因為分配了16,所以輸出的時候只能輸出hello, NIO world,剩下的
// 因為空間關系被截斷。
while(buff.hasRemaining()){
System.out.print((char)buff.get());
}
channel.close();
}
}
Environment 包含常量:
MEDIA_BAD_REMOVAL
解釋:返回getExternalStorageState() ,表明SDCard 被卸載前己被移除
MEDIA_CHECKING
解釋:返回getExternalStorageState() ,表明對象正在磁盤檢查。
MEDIA_MOUNTED
解釋:返回getExternalStorageState() ,表明對象是否存在並具有讀/寫權限
MEDIA_MOUNTED_READ_ONLY
解釋:返回getExternalStorageState() ,表明對象權限為只讀
MEDIA_NOFS
解釋:返回getExternalStorageState() ,表明對象為空白或正在使用不受支持的文件系統。
MEDIA_REMOVED
解釋:返回getExternalStorageState() ,如果不存在 SDCard 返回
MEDIA_SHARED
解釋:返回getExternalStorageState() ,如果 SDCard 未安裝 ,並通過 USB 大容量存儲共享 返回
MEDIA_UNMOUNTABLE
解釋:返回getExternalStorageState() ,返回 SDCard 不可被安裝 如果 SDCard 是存在但不可以被安裝
MEDIA_UNMOUNTED
解釋:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard 是存在但是沒有被安裝
Environment 常用方法:
方法:getDataDirectory()
解釋:返回 File ,獲取 Android 數據目錄。
方法:getDownloadCacheDirectory()
解釋:返回 File ,獲取 Android 下載/緩存內容目錄。
方法:getExternalStorageDirectory()
解釋:返回 File ,獲取外部存儲目錄即 SDCard
方法:getExternalStoragePublicDirectory(String type)
解釋:返回 File ,取一個高端的公用的外部存儲器目錄來擺放某些類型的文件
方法:getExternalStorageState()
解釋:返回 File ,獲取外部存儲設備的當前狀態
方法:getRootDirectory()
解釋:返回 File ,獲取 Android 的根目錄
UI控件之ProgressBar(進度條)
(一)概述(二)常用屬性與基礎實例從官方的API我們可以看到這樣一個類的關系圖:常用屬性詳解 :對應在java我們可以調用下述方法:先看看系統給我們提供的進度條吧運行效果
android導入第三方jar包報錯 如何正確導入jar包
在android上導入zxing.jar包,總是報錯:Could not find class com.google.zxing.MultiFormatWriter, r
Demo3懸浮的按鈕:FloatActionButton(Design Support Lib)
從Demo3開始,接下來會介紹Design Support組件庫中幾個常用的組件,首先就先從Design Support Library開始說起。Android Des
RecyclerView使用完全指南,是時候體驗新控件了(二)
1. 概述水平列表展示,設置LayoutManager的方向性 豎直列表展示,設置LayoutManager的方向性 自定義間隔,RecyclerView.addItem