Tôi lấy đối tượng json sinh ra từ một tập lệnh PHP trên máy chủ của tôi và sau đó phân tích nó thành một listview bằng cách sử dụng một tải lười cho các hình ảnh. Vấn đề là các json sẽ tải tương đối nhanh hoặc nó sẽ treo cho thứ hai hoặc hai tùy thuộc vào phản ứng trên máy chủ, mà có thể được bực bội. Khi tôi lần đầu tiên mở ứng dụng, hang sẽ khó chịu bởi vì nó sẽ treo ở màn hình màu đen cho đến khi đối tượng được tải và sau đó khi tôi cập nhật danh sách trong ứng dụng, nó có cùng nhưng ít nhất chế độ xem đã được tải. Đây là mã của tôi để có được những json:Thiết lập tác vụ không đồng bộ để tải Json vào một listview
public void getJson(String selection, String url) {
JSONObject json = null;
String formatedcat = selection.toLowerCase();
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
json = JSONfunctions
.getJSONfromURL(url);
try {
//the array title that you parse
JSONArray category = json.getJSONArray(formatedcat);
for (int i = 0; i < category.length(); i++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject c = category.getJSONObject(i);
map.put("id", String.valueOf(i));
map.put("name",
c.getString("title"));
//map.put("text",c.getString("title"));
map.put("ts",c.getString("run_date"));
map.put("image","http:"+c.getString("url"));
mylist.add(map);
}
} catch (JSONException e) {
}
ListAdapter adapter = new JsonAdapter(this, mylist, R.layout.list,
new String[] { "name", "text", "ts"}, new int[] { R.id.item_title,
R.id.item_subtitle, R.id.timestamp});
setListAdapter(adapter);
}
Adaptor Code:
public class JsonAdapter extends SimpleAdapter {
public ImageManager imageManager;
public ListActivity context;
public ArrayList<HashMap<String,String>> list;
public String[] fieldNames;
public int[] fieldTargetIds;
public JsonAdapter(ListActivity c,
ArrayList<HashMap<String, String>> mylist,
int textViewResourceId,
String[] fieldNames,
int[] fieldTargetIds) {
super(c, mylist, textViewResourceId, fieldNames, fieldTargetIds);
this.context = c;
this.list = mylist;
this.fieldNames = fieldNames;
this.fieldTargetIds = fieldTargetIds;
this.imageManager = new ImageManager(context.getApplicationContext());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = vi.inflate(R.layout.list, null);
}
//super.getView(position, convertView, parent);
ImageView imgView = (ImageView) row.findViewById(R.id.doodlepic);
try {
String url = list.get(position).get("image");
imgView.setTag(url);
imageManager.displayImage(url, context, imgView);
} catch (Exception e) {
}
for (int i=0; i<fieldNames.length; i++) {
TextView tv = (TextView) row.findViewById(fieldTargetIds[i]);
tv.setText(list.get(position).get(fieldNames[i]));
}
return row;
}
}
Làm thế nào tôi có thể thực hiện một nhiệm vụ async để hiển thị một hộp thoại tiến trình trong khi đối tượng json đang được tạo và tải? Tôi đã thử sử dụng các chủ đề và tác vụ Async nhưng tôi không thể tìm ra cách để tách mã của tôi thành các phần thích hợp.
Bạn nên luôn tạo một chuỗi riêng biệt để xử lý việc tìm nạp JSON . Bằng cách này, ứng dụng của bạn sẽ không bị treo. Không chính xác những gì bạn muốn, nhưng bạn có thể hiển thị văn bản 'Đang tải ...' dưới dạng cửa sổ bật lên trong khi chuỗi của bạn tìm nạp JSON và loại bỏ nó tự động sau khi được tìm nạp. – Urban
Bất kỳ ý tưởng làm thế nào tôi có thể làm cho một sợi cho các chức năng Json tôi liệt kê ở trên? – Nick
điều này có thể giúp: http://stackoverflow.com/a/3027900/595947 – Urban