我怎样才能一个接一个地运行相同的Asynctask

时间:2018-04-04 05:09:58

标签: android firebase android-asynctask

首先,我有一个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 
}

}

1 个答案:

答案 0 :(得分:0)

Firebase数据库客户端已在后台线程中运行所有网络操作。这意味着所有操作都可以在不阻塞主线程的情况下进行。将它放在AsyncTask中并没有带来任何额外的好处。

如果要根据关键字搜索数据库,请按以下步骤操作:

  1. 根据新过滤器

    创建新查询
    Query query = yourRef.orderByChild("yourField").equalTo(searchText);
    
  2. 将侦听器附加到此查询。

  3. 使用此新查询的结果创建新适配器,或更新现有查询。