我有一個奇怪的問題,我不知道如果我做錯了什麼或什麼的。 出於某種原因,我的AsyncTask不會調用doInBackground,但會調用onPostExecute()。這個AsyncTask被調用是很重要的,因爲它初始化了我在整個應用程序的其餘部分需要的變量。AsyncTask的onPostExecute被調用:但doInBackground不是
我在擴展AsyncTask的主要活動中有一個嵌套類。這個類需要從用戶的Dropbox帳戶下載的文件名護理:
protected class FilesLister extends AsyncTask<String, Integer, Long>
{
@Override
protected Long doInBackground(String... params)
{
Log.i("Entries", "We believe Entries has some values now.");
ArrayList<Entry> theFiles = new ArrayList<Entry>();
try
{
Entry entries = mDBApi.metadata("/", 20000, null, true, null);
for (Entry e : entries.contents)
{
Log.i("Hm", e.fileName());
if (!e.isDeleted)
{
if(!e.isDir)
{
theFiles.add(e);
}
}
}
theEntries = theFiles.toArray(new Entry[theFiles.size()]);
} catch (DropboxException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
}
protected void onPostExecute(Long result)
{
super.onPostExecute(result);
Log.i("Now", "Calling refresh.");
refresh();
}
}
就像你所看到的,onPostExecute調用一個方法被稱爲刷新()。 refresh()實現如下:
public void refresh()
{
//Sort all this files by last modified date.
Arrays.sort(theEntries, new Comparator<Entry>()
{
@Override
public int compare(Entry firstFile, Entry secondFile)
{
//"EEE, dd MMM yyyy kk:mm:ss ZZZZZ"
SimpleDateFormat formater = new SimpleDateFormat("EEE, dd MMM yyyy kk:mm:ss ZZZZZ");
try
{
Date date1 = (Date)formater.parse(firstFile.modified);
Date date2 = (Date)formater.parse(secondFile.modified);
return date1.compareTo(date2);
} catch (ParseException e1)
{
e1.printStackTrace();
}
return 0;
}
});
//Now we create a String[] array to hold the names of all the fetched files...
ArrayList<String>txtFilesNames = new ArrayList<String>();
for(int i = theEntries.length - 1; i >= 0; i--)
{
//Loops goes from top to bottom so the latest file appears at the top of the ListView.
txtFilesNames.add(theEntries[i].fileName());
}
actualFileNames = txtFilesNames.toArray(new String[txtFilesNames.size()]);
ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, actualFileNames);
lv.setAdapter(ad);
}
我知道refresh()被調用的原因有兩個:LogCat日誌「調用刷新」。然後由於NullPointerException導致應用程序崩潰。空指針異常被拋出,因爲Entries確實爲null,除非調用doInBackground(),否則它將爲空。我知道doInBackground從來沒有被調用,因爲空指針,因爲我放在它身上的日誌永遠不會被調用。那麼,什麼可能導致我的doInBackground()方法不被調用?如果它很重要,我在我的onResume方法中執行AsyncTask,並且我不會在onCreate或onStart中執行任何其他AsyncTasks。
第一件事,第一,爲什麼你正在使用的AsyncTask <字符串,整數,長>如果你的doinbackground不打算返回任何值何不的AsyncTask <字符串,整數,太虛> ??? – Akram
在doInBackground中設置一個斷點,並使用調試器遍歷代碼。 – Zambotron