Java AsyncTask doInbackground返回arraylist值,但onPostExecute arraylist中的值为0

Java AsyncTask doInbackground返回arraylist值,但onPostExecute arraylist中的值为0,java,android,arrays,arraylist,android-asynctask,Java,Android,Arrays,Arraylist,Android Asynctask,在AsynctaskdoInBackground中,我从firebase数据库获取arraylist并返回arraylist(返回30个映射)结果,但在onPostExecute中,arraylist为0(不保留doInBackground中的数据)。我认为-后台的问题就像一条平行线。好啊 我还尝试将doInbackground中的数据插入onCreate,但它也不起作用(返回arraylist 0)。 这是我的密码。我的代码有什么问题 public void onCreate(Bundle

在AsynctaskdoInBackground中,我从firebase数据库获取arraylist并返回arraylist(返回30个映射)结果,但在onPostExecute中,arraylist为0(不保留doInBackground中的数据)。我认为-后台的问题就像一条平行线。好啊 我还尝试将doInbackground中的数据插入onCreate,但它也不起作用(返回arraylist 0)。 这是我的密码。我的代码有什么问题

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_main);
        ParseTitle parseTitle = new ParseTitle();
        parseTitle.execute();
    }
public class ParseTitle extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        avLoadingIndicatorView = (com.wang.avi.AVLoadingIndicatorView) findViewById(R.id.avi);
        avLoadingIndicatorView.show();
    }

    @Override
    protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
        arraylist = new ArrayList<HashMap<String, String>>();
        database = FirebaseDatabase.getInstance();
        ref1 = database.getReference("work");
        ref = ref1.child("worker");
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    String s_position = (String) ds.child("v_position").getValue();
                    String s_employer = (String) ds.child("v_company").getValue();
                    String s_posted = (String) ds.child("v_post").getValue();
                    String s_link = (String) ds.child("v_url").getValue();

                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("POSITION", s_position);
                    map.put("EMPLOYER", s_employer);
                    map.put("POSTED", s_posted);
                    map.put("LINK", s_link);
                    map.put("TYPE", "IT");
                    arraylist.add(map);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
               // System.out.println("The read failed: " + DatabaseError.DATA_STALE);
            }
        });
        return  arraylist;
    }
    @Override
    protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
        listView = (ListView) findViewById(R.id.listview);
      //  Collections.sort(arraylist,SortByValue);
        //HashMap<String, Integer> sortedMap = (HashMap<String, Integer>) sortByValue(arraylist);
       // if(arraylist != null && arraylist.size() > 0) {
            adapter = new ListViewAdapter(IT.this, arraylist);
            listView.setAdapter(adapter);
            avLoadingIndicatorView.hide();
            findViewById(android.R.id.content).setBackgroundColor(Color.TRANSPARENT);
      //  }
    }
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
ParseTitle ParseTitle=新的ParseTitle();
parseTitle.execute();
}
公共类ParseTitle扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
avLoadingIndicatorView=(com.wang.avi.avLoadingIndicatorView)findViewById(R.id.avi);
avLoadingIndicatorView.show();
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
arraylist=新的arraylist();
database=FirebaseDatabase.getInstance();
ref1=database.getReference(“工作”);
ref=ref1.儿童(“工人”);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
字符串s_位置=(字符串)ds.child(“v_位置”).getValue();
字符串s_雇主=(字符串)ds.child(“v_公司”).getValue();
字符串s_post=(字符串)ds.child(“v_post”).getValue();
字符串s_link=(字符串)ds.child(“v_url”).getValue();
HashMap=newHashMap();
地图放置(“位置”,s_位置);
map.put(“雇主”,s_雇主);
地图放置(“已张贴”,s_已张贴);
地图放置(“链接”,s_链接);
地图放置(“类型”、“IT”);
arraylist.add(map);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
//System.out.println(“读取失败:+DatabaseError.DATA\u STALE”);
}
});
返回数组列表;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
listView=(listView)findViewById(R.id.listView);
//Collections.sort(arraylist、SortByValue);
//HashMap sortedMap=(HashMap)sortByValue(arraylist);
//if(arraylist!=null&&arraylist.size()>0){
adapter=新的ListViewAdapter(IT.this,arraylist);
setAdapter(适配器);
avLoadingIndicatorView.hide();
findviewbyd(android.R.id.content).setBackgroundColor(Color.TRANSPARENT);
//  }
}
}
如果有人能帮我解决上面提到的问题,那就太好了。:)

替换:

adapter = new ListViewAdapter(IT.this, arraylist);


不需要整个
AsyncTask
,因为
FirebaseDatabase
事件称为异步。您的
doInBackground
非常快速地运行,在收到
onDataChange
中的结果之前,会调用
onPostExecute
。 如果没有
AsyncTask
,它可能会如下所示:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_main);
        ParseTitle parseTitle = new ParseTitle();
        parseTitle.execute();
avLoadingIndicatorView = (com.wang.avi.AVLoadingIndicatorView) findViewById(R.id.avi);
avLoadingIndicatorView.show();
arraylist = new ArrayList<HashMap<String, String>>();
database = FirebaseDatabase.getInstance();
ref1 = database.getReference("vacancies");
ref = ref1.child("jobsearch");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String s_position = (String) ds.child("v_position").getValue();
            String s_employer = (String) ds.child("v_company").getValue();
            String s_posted = (String) ds.child("v_post").getValue();
            String s_link = (String) ds.child("v_url").getValue();

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("POSITION", s_position);
            map.put("EMPLOYER", s_employer);
            map.put("POSTED", s_posted);
            map.put("LINK", s_link);
            map.put("TYPE", "IT");
            arraylist.add(map);
        }
        adapter = new ListViewAdapter(IT.this, arraylist);
        listView.setAdapter(adapter);
        avLoadingIndicatorView.hide();
        findViewById(android.R.id.content).setBackgroundColor(Color.TRANSPARENT);

    }
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
ParseTitle ParseTitle=新的ParseTitle();
parseTitle.execute();
avLoadingIndicatorView=(com.wang.avi.avLoadingIndicatorView)findViewById(R.id.avi);
avLoadingIndicatorView.show();
arraylist=新的arraylist();
database=FirebaseDatabase.getInstance();
ref1=database.getReference(“空缺”);
ref=ref1.子女(“求职”);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot ds:DataSnapshot.getChildren()){
字符串s_位置=(字符串)ds.child(“v_位置”).getValue();
字符串s_雇主=(字符串)ds.child(“v_公司”).getValue();
字符串s_post=(字符串)ds.child(“v_post”).getValue();
字符串s_link=(字符串)ds.child(“v_url”).getValue();
HashMap=newHashMap();
地图放置(“位置”,s_位置);
map.put(“雇主”,s_雇主);
地图放置(“已张贴”,s_已张贴);
地图放置(“链接”,s_链接);
地图放置(“类型”、“IT”);
arraylist.add(map);
}
adapter=新的ListViewAdapter(IT.this,arraylist);
setAdapter(适配器);
avLoadingIndicatorView.hide();
findviewbyd(android.R.id.content).setBackgroundColor(Color.TRANSPARENT);
}
}

你在哪里声明
arraylist
?在任何情况下,
onPostExecute
只有在异步任务完成后才会被Android调用,这是有保证的。所以你担心它还没有完成,这一点现在还不可能是真的。对不起,伙计,在onPreExcute中初始化你的arraylist,然后检查…@SuryanarayanaReddy how to to to to to do帽子?你能展示吗?@TimBiegeleisen Arraylist正在doInBackground中声明。不,不是。你在后台任务中初始化它,但你肯定不会在那里声明它。你在哪里声明它?只需在编写时检查,但结果大小也是0。假设
Arraylist
在一个同样对
onPostExecute
可见。需要在构造函数中初始化arrayList,在doInBackground()之外;我从doInBackground()中删除了arrayList=new arrayList();但现在arrayList返回null。这不起作用…为类ParseTitle创建构造函数。init arryList谢谢你的帮助。我像你建议的那样检查了
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_main);
        ParseTitle parseTitle = new ParseTitle();
        parseTitle.execute();
avLoadingIndicatorView = (com.wang.avi.AVLoadingIndicatorView) findViewById(R.id.avi);
avLoadingIndicatorView.show();
arraylist = new ArrayList<HashMap<String, String>>();
database = FirebaseDatabase.getInstance();
ref1 = database.getReference("vacancies");
ref = ref1.child("jobsearch");
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            String s_position = (String) ds.child("v_position").getValue();
            String s_employer = (String) ds.child("v_company").getValue();
            String s_posted = (String) ds.child("v_post").getValue();
            String s_link = (String) ds.child("v_url").getValue();

            HashMap<String, String> map = new HashMap<String, String>();
            map.put("POSITION", s_position);
            map.put("EMPLOYER", s_employer);
            map.put("POSTED", s_posted);
            map.put("LINK", s_link);
            map.put("TYPE", "IT");
            arraylist.add(map);
        }
        adapter = new ListViewAdapter(IT.this, arraylist);
        listView.setAdapter(adapter);
        avLoadingIndicatorView.hide();
        findViewById(android.R.id.content).setBackgroundColor(Color.TRANSPARENT);

    }
}