【发布时间】:2018-04-04 05:09:58
【问题描述】:
首先,我有一个包含股票字符串的数组列表(来自 firebase 的数据)。
然后我需要将这些股票字符串传递给 asynctask 。 asynctask 将从一个 url 获取 json,这样我就可以获取其他股票信息来构建我的列表视图。
问题是我不知道如何一一执行异步任务。我在论坛上阅读了几篇帖子,但它不适合我的情况。
这是我的 Asynctask 代码:
public class SearchingAsyncTask extends AsyncTask<String, String, HashMap<String, String>> {
private static final String TAG = SearchingAsyncTask.class.getSimpleName();
Searching listener;
int i=0;
public void setListener(Searching listener){
this.listener = listener;
}
@Override
protected HashMap<String, String> doInBackground(String... arg0){
HashMap<String, String> hashResult = new HashMap<>();
getMoney18DailyJson(hashResult, arg0[0]);
getMoney18RealJson(hashResult, arg0[0]);
return hashResult;
}
@Override
protected void onPostExecute(HashMap<String, String> result){
listener.getInfo(result);
}
这是我的搜索界面:
public interface Searching {
void getInfo(HashMap<String, String> info); }
我想调用我的 Asynctask 的地方
public class LoadBookMarkList implements Searching{
public static ArrayList<String> quote = new ArrayList<>();
public HashMap mark=new HashMap();
private FirebaseAuth auth;
public int i;
public void inti() {
i=0;
auth = FirebaseAuth.getInstance();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(auth.getUid()).child("BookMark");
ref.keepSynced(true);
ref.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
getQuote((Map<String,Object>) dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
//handle databaseError
}
});
}
public void getQuote(Map<String,Object> users) {
//iterate through each user, ignoring their UID
for (Map.Entry<String, Object> entry : users.entrySet()){
//Get user map
Map singleUser = (Map) entry.getValue();
//Get phone field and append to list
quote.add(singleUser.get("quote").toString());
}
SearchingAsyncTask searchBookMark = new SearchingAsyncTask();
searchBookMark.setListener(LoadBookMarkList.this);
searchBookMark.execute("0"+quote.get(i));
//I want to loop the execute() so i can input all arraylist element in to
//the asynctask
}
@Override
public void getInfo(HashMap<String, String> info){
mark.put("Quote", quote.get(i));
mark.put("ComName", info.get("name"));
mark.put("Price", info.get("np"));
mark.put("Increase","-0.5");
mark.put("InPer","-0.5");
Search.bookMarkData.add(mark); //for Listview
}
}
【问题讨论】:
-
Object result = searchBookMark.execute("0"+quote.get(i)).get();但它会阻塞你的主线程 -
stackoverflow.com/a/10049087/9186864 为你解释了很多。
-
我之前尝试过这个,但是我遇到的问题是异步任务总是保持运行并且永远不会进入完成阶段......
-
//I want to loop the execute() so i can input all arraylist element in to //the asynctask???不清楚你想要什么。如果你想要一个循环而不是循环。之后,您可以判断它是否有效并要求 cmets。
标签: android firebase android-asynctask