![](/img/trans.png)
[英]Asynctask ArrayList object not passing from doInBackground to onPostExecute
[英]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.