首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android -异步任务执行顺序

Android -异步任务执行顺序
EN

Stack Overflow用户
提问于 2018-09-28 05:28:01
回答 2查看 113关注 0票数 0

我有一个关于AsyncTask的问题,onPostExecute方法在doInBackground方法完成它的工作之前运行。

我正在尝试从Firebase数据库中获取一些数据,将其保存到"Didattica“对象的数组列表中,以传递到可扩展的列表视图,我在数据库中有4个对象。

问题是onPostExecutedoInBackground之后不久就会运行,然后doInBackground完成填充arrayList的工作。

public class DidatticaActivity extends AppCompatActivity {

ArrayList<Didattica> reishiki1 = null;
private ExpandableListView listView1;
private ExpandableListAdapter listAdapter1;
private List<String> listDataHeader1;
private HashMap<String, List<String>> listHash1;
AsyncTaskDidattica atDidattica;

final FirebaseDatabase database = FirebaseDatabase.getInstance();
private DatabaseReference refDidattica1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_didattica);

    listHash1 = new HashMap<>();
    listDataHeader1 = new ArrayList<>();
    listView1 = findViewById(R.id.lvReishiki);
    atDidattica = new AsyncTaskDidattica();
    atDidattica.execute();
    listAdapter1 = new ExpandableListAdapter(this, listDataHeader1,listHash1);
    listView1.setAdapter(listAdapter1);
}

private class AsyncTaskDidattica extends AsyncTask<String, String, HashMap<String, ArrayList<Didattica>>>{

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected HashMap<String, ArrayList<Didattica>> doInBackground(String... strings) {
        HashMap result = new HashMap<>();
        reishiki1 = new ArrayList<>();
        try {
            refDidattica1 = database.getReference("didattica/1-reishiki");

            refDidattica1.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot1) {
                    Log.i("shinseiLog", "onDataChange" );
                    for (DataSnapshot child1 : dataSnapshot1.getChildren()) {
                        Didattica d1 = child1.getValue(Didattica.class);
                        reishiki1.add(d1);
                    }
                    Log.i("shinseiLog", "rei size1: " + reishiki1.size());
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {}
            });
            result.put("reishiki", reishiki1);
            Log.i("shinseiLog", "map size 1: " + result.size());
            return result;
        }catch(Exception e){
            Log.i("shinseiLog", "eccezione in doInBackground");
        }
        return null;
    }
    @Override
    protected void onPostExecute(HashMap<String, ArrayList<Didattica>> result) {
        super.onPostExecute(result);
        ArrayList<Didattica> rei = result.get("reishiki");
        Log.i("shinseiLog", "rei size2: " + rei.size());
        for(Didattica r: rei){
            listDataHeader1.add(r.getTitolo());
            listHash1.put(r.getTitolo(),r.getList());
        }
        Log.i("shinseiLog", "header: " + listDataHeader1.size());
        Log.i("shinseiLog", "hash: " + listHash1.size());

        listAdapter1.notifyDataSetChanged();
        }
    }
}

我添加了一些日志来帮助理解顺序:

I/shinseiLog: map size 1: 1
I/shinseiLog: rei size2: 0
I/shinseiLog: header: 0
I/shinseiLog: hash: 0
I/shinseiLog: onDataChange
I/shinseiLog: rei size1: 4

最后一行正确地显示了arrayList包含了我的所有数据,但为时已晚。为什么它以这种方式执行?我哪里错了?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-28 05:43:16

请记住,firebase是异步的。所以你的方法...

public void onDataChange(DataSnapshot dataSnapshot1) {
}

在另一个线程中执行的...is。这就是onPostExecute首先被执行的原因。

尝试一下,将onPostexecute代码中的代码放入onDataChangesee this picture方法中

票数 0
EN

Stack Overflow用户

发布于 2018-09-28 05:31:06

Firebase已经是异步的,你不需要使用AsyncTask来获取或上传数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52545395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档