繁体   English   中英

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

[英]AsyncTask doInbackground returns arraylist value but in onPostExecute arraylist is 0

在Asynctask doInBackground中,我从firebase数据库获取arraylist并返回arraylist(返回30张地图)结果,但是在onPostExecute arraylist中为0(不保留doInbackground中的数据)。 我认为问题-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);
      //  }
    }
}

如果有人帮我解决上面指定的麻烦,那将是非常好的。 :)

更换:

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

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

不需要整个AsyncTask ,因为FirebaseDatabase事件称为异步事件。 doInBackground只贯穿真快和onPostExecute收到结果之前被称为onDataChange 如果没有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);

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM