Ich arbeite an einer App, die eine JSON-Antwort von einem Webservice erhalten sollte und jedes Element in einem listview schreiben, ich habe gelesen, dass ich mit AsyncTask arbeiten sollte, um die HTTP-Antwort zu bekommen, und ich tat es und ich konnte Daten vom Webservice abrufen und sie in TextViews anzeigen. Aber wenn ich versuche Elemente in einer Listenansicht angezeigt werden ist es nicht angezeigt werden etwas und gibt mir die folgende Meldung in der logcat: 06-05 19:44:27.418: I/Choreographer(20731): Skipped 60 frames! The application may be doing too much work on its main thread.
Übersprungen 60 Frames! Die Anwendung möglicherweise zu viel Arbeit an seinem Hauptthread
hier ist mein Haupt-Code:
public class MainActivity extends Activity {
private static JsonObject response = new JsonObject();
private ArrayList<SearchResults> results = new ArrayList<SearchResults>();
private SearchResults sr1 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new LoginAction().execute("");
ArrayList<SearchResults> searchResults = results;
final ListView lv1 = (ListView) findViewById(R.id.ListView01);
lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class LoginAction extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
Map<String, String> callArgs = new HashMap<String, String>(1);
callArgs.put("suuid", "dtr0bdQGcqwSh3QO7fVwgVfBNWog6mvEbAyljlLX9E642Yfmur");
try {
response = EventPulseCloud.call("ListEvents", callArgs);
} catch (HttpClientException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JsonException e) {
e.printStackTrace();
}
return response.get("Type").toString();
}
protected void onPostExecute(String result) {
if(result.equals("success")) {
JsonArray records = null;
try {
records = response.getObject ("Data").getArray ("Records");
} catch (JsonException e) {
e.printStackTrace();
}
for(int i = 0; i < records.count(); i++) {
JsonObject record = (JsonObject) records.get(i);
sr1 = new SearchResults();
sr1.setAddress(record.get("address").toString());
results.add(sr1);
}
}
}
}
}
Meine Liste Adapter:
public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<SearchResults> searchArrayList;
private LayoutInflater mInflater;
public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_row_view, null);
holder = new ViewHolder();
holder.txtAddress = (TextView) convertView.findViewById(R.id.address);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtAddress.setText(searchArrayList.get(position).getAddress());
return convertView;
}
static class ViewHolder {
TextView txtAddress;
}
}
und schließlich SearchResults.java:
public class SearchResults {
private String address = "";
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
Also, was mache ich falsch? Hast du eine Vorstellung davon?
Vielen Dank.
Dies ist keine Lösung, sondern ein Test, der helfen könnte herauszufinden, wo das Problem herkommt. Diese for-Schleife könnte das Problem sein, versuchen Sie es mit einer Zahl wie 1 anstelle von 'records.count()' und sehen Sie, ob Sie immer noch den Fehler erhalten, versuchen Sie einfach, jeden Bereich, der das Problem sein kann. – Osman
lassen Sie mich wissen, was passiert ... oder Sie können die Länge der Datensätze ausgeben, wenn es zu lang ist, versuchen Sie die Verarbeitung auf dem hinteren Thread, bevor Sie es auf den Hauptthread bringen ... – Osman
Vielen Dank. es zeigt nichts an, aber gibt mir '06-05 21: 27: 32,367: I/dalvikvm-heap (23426): Wachsen Heap (frag case) auf 8,924 MB für 691216-Byte-Zuweisung ' – Copernic