【问题标题】:How can I run the same Asynctask one after one finished如何在一个完成后运行相同的 Asynctask
【发布时间】: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


【解决方案1】:

Firebase 数据库客户端已在后台线程中运行所有网络操作。这意味着所有操作都不会阻塞您的主线程。将其放入 AsyncTask 不会带来任何额外的好处。

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

  1. 根据新过滤器创建新查询

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

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

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多