我試圖通過從網站上刪除數據來填充RecyclerView。問題是getData()
方法SearchCards.java
(模型)返回字符串(pageTitle)之前AsyncTask已完成執行導致空字符串。這裏是我的代碼如何僅在AsyncTask的onPostExecute()執行後才返回值?
FragmentOne.java
mAdapter = new SearchAdapter(SearchCards.getData(),this,recyclerView);
recyclerView.setAdapter(mAdapter);
SearchCards.java
public static ArrayList<SearchCards> getData() {
ArrayList<SearchCards> datatList = new ArrayList<SearchCards>();
String pageTitle = new Scrapping().scrapSubs(); //scrapSubs contains AsynTask
String[] yearArr = setYearArr();
for (int i = 0; i < yearArr.length; i++) {
SearchCards searchCard = new SearchCards();
searchCard.setYear(yearArr[i]);
searchCard.setTitle(pageTitle); //same pagetitle for every year
datatList.add(searchCard);
}
return dataList;
}
Scrapping.java
public String ScrapSubs(){
JsoupAsyncTask jsoupAsyncTask = new JsoupAsyncTask();
jsoupAsyncTask.execute();
return pageTitle;
}
private class JsoupAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
htmlDocument = Jsoup.connect(htmlPageUrl).get();
pageTitle = htmlDocument.title();
Log.i(TAG,"PAGETITLE"+pageTitle);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
//do something
}
}
如何在Scrapping.java中執行類似返回pageTitle的操作,僅在AsyncTask執行完成後執行。我試過,但沒有奏效:
if(jsoupAsyncTask.getStatus() == AsyncTask.Status.FINISHED){
return pageTitle;
}
編輯: 可能這不是一個精心研究的問題。在這裏我找到了我正在尋找的東西:http://stacktips.com/tutorials/android/android-recyclerview-example 我只需要在onPostExecute()中移動SearchAdapter初始化。
'保護無效onPostExecute(虛空結果){// 做something'。不僅是某種東西。但是,例如調用一個修改的getData()並設置你的列表視圖。這是正常的方式。請改編你的設計。你現在所擁有的並不是一帆風順的。 – greenapps
可能的重複http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is-a –
感謝您的意見。我對android很陌生並正在嘗試適應。雖然這裏的答案給了我一些清晰的內容。 – mustafa1993