首先,我有一个arraylist(来自firebase的数据),其中包含了字符串。
然后我需要将那些股票字符串传递给asynctask。 asynctask将从一个url获取json,这样我就可以获得其他股票信息来构建我的listview。
问题是我不知道如何逐个执行asynctask。我在论坛上看过几篇帖子,但不适合我的案例。
这是我的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
}
}
答案 0 :(得分:0)
Firebase数据库客户端已在后台线程中运行所有网络操作。这意味着所有操作都可以在不阻塞主线程的情况下进行。将它放在AsyncTask
中并没有带来任何额外的好处。
如果要根据关键字搜索数据库,请按以下步骤操作:
根据新过滤器
创建新查询Query query = yourRef.orderByChild("yourField").equalTo(searchText);
将侦听器附加到此查询。
使用此新查询的结果创建新适配器,或更新现有查询。