Einrichten asynchrone Aufgabe für das laden von Json in eine listview

Nehme ich json-Objekt generieren, die von einem PHP-Skript auf meinem server und dann analysieren und es in eine listview mit einem lazy load für Bilder. Das problem ist, dass die json-laden relativ schnell, oder es hängen für die zweite oder zwei, je nach der Reaktion auf dem server, die kann frustrierend sein. Als ich zuerst die app öffnen, der hang ist besonders ärgerlich, weil es hängen bei einem schwarzen Bildschirm, bis das Objekt geladen wurde und wenn ich dann die Liste aktualisieren in der app, es hat den gleichen aber zumindest die Ansicht geladen wurde. Hier ist mein code, um die json:

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);        
}

Adapter-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;
    }

}

Wie könnte ich implementieren eine asynchrone Aufgabe, um zu zeigen, eine Fortschrittsanzeige, während das json-Objekt wird erzeugt und heruntergeladen? Ich habe versucht, die Verwendung von threads und Asynchrone Aufgabe, aber ich kann nicht ganz herausfinden, wie Sie auseinander brechen, meinen code in die entsprechenden stellen.

Sie sollten immer erstellen Sie einen separaten thread zu behandeln, die JSON Holen. So wird Ihre app nicht hängen. Nicht genau, was Sie wollen, aber Sie können zeigen, wie ein 'Loading...' - Text als popup, während dein thread liest die JSON-und schließen sich automatisch, wenn Ihr abgeholt.
Irgendeine Idee, wie kann ich einen thread für die Json-Funktion, die ich oben aufgeführt?
dies könnte helfen: stackoverflow.com/a/3027900/595947

InformationsquelleAutor Nick | 2012-02-19

Schreibe einen Kommentar