【发布时间】:2017-03-18 09:51:46
【问题描述】:
我试图通过从网站上抓取数据来填充 RecyclerView。问题是SearchCards.java(模型)的getData() 方法在AsyncTask 完成执行之前返回字符串(pageTitle),导致空字符串。这是我的代码
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 中执行诸如 return pageTitle 之类的操作,仅在 AsyncTask 执行完成后执行。我试过了,但没有用:
if(jsoupAsyncTask.getStatus() == AsyncTask.Status.FINISHED){
return pageTitle;
}
编辑: 可能这不是一个经过充分研究的问题。在这里我找到了我想要的东西:http://stacktips.com/tutorials/android/android-recyclerview-example 我所要做的就是在 onPostExecute() 中移动 SearchAdapter 初始化。
【问题讨论】:
-
protected void onPostExecute(Void result) { //do something。不仅是东西。但例如调用修改后的 getData() 并设置您的列表视图。这是正常的方式。请调整您的设计。你现在拥有的根本不是要走的路。 -
感谢您的意见。我是 android 新手,正在努力适应。虽然这里的答案让我更清楚地继续。
标签: java android android-asynctask android-recyclerview