android資料庫非同步載入數據
Ⅰ android中listview的數據的同步與非同步載入有什麼區別,效果有什麼不同
目前沒有同步載入數據這種做法,如果網路延遲主界面UI就卡死了,
之後用戶不耐煩就只能強行關閉了,卡死的時候按鍵都沒反應的。
一個簡單的的多線程
class updatelocationTask extends AsyncTask<String, Integer, Response> {
protected void onPreExecute() {
//這里寫執行doInBackground方法之前要做的什麼,比如說彈出ProgressDialog
}
}
@Override
protected Response doInBackground(String... params) {
//這里就是線程裡面的方法了,比如說建立連接,請求數據
}
}
protected void onPostExecute(Response result) {
//這里可以根據返回值來確定怎麼操作,比如說刷新列表或者提示用戶網路不暢,是否再次刷新
}
}
}
}
Ⅱ Android ListView 實現非同步 分頁 載入導致的數據問題
在請求第二頁及以後頁數的時候帶多一個參數,就是第一次請求到的數據的最後一條的id,當然服務端的每個數據都有id,id根據你的排序規律,排在前面的可以設置為大點的,最後面的為最小的。服務端根據請求過來id,就可以確認已經發送了此id之前的數據(包括id這條數據,id之前的數據有可能有新的數據插入,但是此時客戶端需要的只是之後的數據,所以直接把id之後的10條數據發給客戶端即可)。此外,如果客戶端想獲得新插入的數據,只要請求第一頁就行了。
Ⅲ android service非同步網路載入怎麼實現
**
* 封裝ProecssDialog對話框
*
*/
public class LoadDialog extends ProgressDialog {
private String title = "進度對話框";
private String message = "載入數據中....";
public LoadDialog(Context context, int theme) {
super(context, theme);
}
/**
* 用默認的標題和內容來創建對話框
* @param context
*/
public LoadDialog(Context context) {
super(context);
initDialog();
}
/**
* 用指定的標題和內容來創建對話框
* @param context
* @param title
* @param message
*/
public LoadDialog(Context context,String title,String message){
super(context);
if(title != null){
this.title = title;
}
if(message != null){
this.message = message;
}
initDialog();
}
/**
* 初始化對話框參數,默認對話框不可以取消
*/
public void initDialog(){
setTitle(title);
setMessage(message);
setProgressStyle(ProgressDialog.STYLE_SPINNER);
setCancelable(false);
}
/**
* 打開對話框,設置回調方法,傳遞需要執行業務方法的類模板,方法名和參數列表
* @param callback 回調方法,該方法在對話框關閉後回調,並獲取返回的數據
* @param serviceClass 執行業務方法的類模板
* @param method 執行業務方法的方法名
* @param params 執行業務方法的參數列表
*/
public void execute(Callback callback,Class serviceClass,String method,Object... params){
super.show();
ServiceAysnTask task = new ServiceAysnTask(callback,serviceClass,method);
task.execute(params);
}
/**
* 回調方法的介面
*
*/
public interface Callback{
public void getResult(Map map);
}
/**
* 與遠程服務通信的線程類
* @author BDK
* AsyncTask 非同步任務
*/
private class ServiceAysnTask extends AsyncTask<object,object,map>{
private Class serviceClass;
private String method;
private Callback callback;
public ServiceAysnTask(Callback callback,Class serviceClass,String method){
this.callback = callback;
this.serviceClass = serviceClass;
this.method = method;
}
@Override
protected Map doInBackground(Object... params) {
Map resultMap = null;
try {
Object obj = serviceClass.newInstance();//創建類模板對象
Class [] paramTypes = new Class[params.length];
for (int i = 0; i < paramTypes.length; i++) {
paramTypes[i] = params[i].getClass();
}
//根據類模板得到方法
Method m = serviceClass.getMethod(method, paramTypes);
resultMap = (Map) m.invoke(obj, params);
} catch (Exception e) {
e.printStackTrace();
}
LoadDialog.this.cancel();
return resultMap;
}
@Override
protected void onPostExecute(Map result) {
super.onPostExecute(result);
if(result == null){
Toast.makeText(LoadDialog.this.getContext(), "網路通信異常", Toast.LENGTH_LONG).show();
return;
}
callback.getResult(result);
}
}
}
</object,object,map>
Ⅳ android開發,非同步載入數據被突然彈出的電話界面打斷,怎麼辦
非同步查詢數據時,被來電打斷,線程會拋出異常或者會被掛起,建議查看logcat中的日誌。
Android開發中,所的有輸出都在logcat中 包含System.out輸出和printStackTrace()輸出都在Logcat中,Android開發,建議使用android提供的Log工具類來列印信息。
找到Logcat視圖的方式:
1. Eclipse 點擊 Window。
2. Show View會出來一個對話框。
3. 點擊Ok按鈕時,會在控制台窗口出現LogCat視圖。
Ⅳ android 非同步載入有幾種方法
子線程沒有控制並發數量,當並發過多的時候非同步方法的作用就體現出來了。
非同步是相對於同步而言的,顧名思義,同步就是各個通訊節點之間有統一的時鍾,按照相同的時鍾工作,非同步相反,各節點之間沒有統一的時鍾,每個節點按照自己內部的時鍾工作。
android在所有Thread當中,有一個Thread,我們稱之為UI Thread。UI
Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main
Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI
Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。
Ⅵ Android 非同步載入數據 創建子進程下載數據,ListView第一次載入無數據,第二次載入載才有數據
因為是非同步的,你下載完數據;需要再 進行 adapter.notifyDataSetChanged();
Ⅶ Android電子書app中,離線緩存是不是非同步數據載入載入技術完成的,如果是,原理是什麼
離線緩存就是在網路暢通的情況下將從伺服器收到的數據保存到本地,當網路斷開之後直接讀取本地文件中的數據。
將網路數據保存到本地:
你可以自己寫一個保存數據成本地文件的方法,保存在android系統的任意目錄(當然是有許可權的才行),但是在這種情況下使用Context的openFileOutput方法最簡便也最符合我們的場景,下面的saveObject方法演示了如何用openFileOutput將數據保存在本地的一個文件中:
saveObject
public static boolean saveObject(Serializable ser, String file) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = AppContext.getInstance().openFileOutput(file, AppContext.getInstance().MODE_PRIVATE);
oos = new ObjectOutputStream(fos);
oos.writeObject(ser);
oos.flush();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
oos.close();
} catch (Exception e) {
}
try {
fos.close();
} catch (Exception e) {
}
}
}
openFileOutput可以直接獲得一個和應用關聯的文件路徑(在/data/data//files下面),然後使用java io中的ObjectOutputStream將序列化的對象寫入(writeObject)到得到的文件中,你可以看到上面的實現過程有兩個關鍵方法:openFileOutput、writeObject以及調用它們的兩個關鍵對象Context和ObjectOutputStream。關於序列化可以參看這篇文章:Java對象的序列化和反序列化實踐