在非同步載入 AsyncTask 中用動態的陣列作為引數
阿新 • • 發佈:2019-01-05
分析問題:在非同步執行的時候,
new DownloadTextTask().execute("http://192.168.1.56:30002/?ID=101&NO=0",
"http://192.168.1.56:30002/?ID=102&NO=0"); // 下載檔案
那麼這裡面的這兩個 String 型別引數是固定的,在實際開發中,我下載的這個路徑一般是從XML檔案解析下來的,要是我們解析得到的路徑個數不確定和路徑的內容不確定的情況下,上面這個方法的缺陷很快就暴漏出來了。
決解的思路:
首先我們先來了解這句 protected Boolean doInBackground(String... urls) { }
從這裡我們知道,(String... urls) 裡面是一個可變引數的陣列,是把new DownloadTextTask().execute("……","……");轉化為一個數組。因此,我們就要從傳入的引數入手,決解的辦法就是,不要把 String 一個一個的傳入了,我們直接把一個 String[ ] 型別傳進去。
下面就來介紹在專案中應用吧!
總體的程式碼:
if (isNetworkAvailable()) {
MyDB db = new MyDB(WelcomeActivity.this);
Cursor cursor = db.SECELTSQL(InfoBean.find());
String[] list = getList(cursor);
if (list.length != 0) {
new DownloadImageTask().execute(list); // 下載圖片
}else{
Log.d("WecomeActivity", "下圖片的list.size()為空!");
}
} else {
Toast.makeText(WelcomeActivity.this, "網路連結出錯,請檢查網路!", 1).show();
}
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
我通過資料庫的查詢獲取 cursor 物件: Cursor cursor = db.SECELTSQL(InfoBean.find()); // 因為我解析到的檔案路徑儲存到資料庫中,這裡去查詢檔案的路徑 String[] list = getList(cursor); 獲取 String[ ] 陣列的 public String[] getList(Cursor cursor) {
arr = new String[cursor.getCount()];
if(cursor!=null){
cursor.moveToFirst();
for(int i=0;i<cursor.getCount();i++){
// String id = cursor.getString(0);
// arr[i] = "http://192.168.1.56:20002/?ID=103&NO="+id;
arr[i] = cursor.getString(0); // 把路徑儲存到陣列中
cursor.moveToNext();
}
return arr;
}
return null;
}
在非同步類的 doInBackground 中
protected Boolean doInBackground(String... urls) {
int count = 0;
for (int i = 0; i < urls.length;i++) {
// ---download the image---
Log.d("WelcomeActivity", "驗證 urls["+i+"]:的值"+urls[i]+"\t urls的長度為:"+urls.length);
LoadDown load = new LoadDown(WelcomeActivity.this);
執行結果:
MyDB db = new MyDB(WelcomeActivity.this);
Cursor cursor = db.SECELTSQL(InfoBean.find());
String[] list = getList(cursor);
if (list.length != 0) {
new DownloadImageTask().execute(list); // 下載圖片
}else{
Log.d("WecomeActivity", "下圖片的list.size()為空!");
}
} else {
Toast.makeText(WelcomeActivity.this, "網路連結出錯,請檢查網路!", 1).show();
}
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
我通過資料庫的查詢獲取 cursor 物件: Cursor cursor = db.SECELTSQL(InfoBean.find()); // 因為我解析到的檔案路徑儲存到資料庫中,這裡去查詢檔案的路徑 String[] list = getList(cursor); 獲取 String[ ] 陣列的 public String[] getList(Cursor cursor) {
arr = new String[cursor.getCount()];
if(cursor!=null){
cursor.moveToFirst();
for(int i=0;i<cursor.getCount();i++){
// String id = cursor.getString(0);
// arr[i] = "http://192.168.1.56:20002/?ID=103&NO="+id;
arr[i] = cursor.getString(0); // 把路徑儲存到陣列中
cursor.moveToNext();
}
return arr;
}
return null;
}
在非同步類的 doInBackground 中
protected Boolean doInBackground(String... urls) {
int count = 0;
for (int i = 0; i < urls.length;i++) {
// ---download the image---
Log.d("WelcomeActivity", "驗證 urls["+i+"]:的值"+urls[i]+"\t urls的長度為:"+urls.length);
LoadDown load = new LoadDown(WelcomeActivity.this);
執行結果: