Sto lavorando su un'app che dovrebbe ricevere una risposta JSON da un webservice e scrivere ogni elemento in una listview , ho letto che dovrei lavorare con AsyncTask per ottenere la risposta HTTP e l'ho fatto e ho potuto recuperare i dati dal webservice e visualizzarli in TextViews. Ma quando cerco di visualizzare gli elementi in una lista non visualizza nulla e mi dà il seguente messaggio nel 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.
Ha saltato 60 fotogrammi! L'applicazione potrebbe fare troppo lavoro sul suo thread principale
Ecco il mio codice principale:
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);
}
}
}
}
}
mio adattatore lista:
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;
}
}
e, infine, SearchResults.java:
public class SearchResults {
private String address = "";
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
Quindi, cosa faccio di sbagliato? Hai un'idea a riguardo?
Grazie.
Questa non è una soluzione ma un test che potrebbe aiutare a capire da dove il problema proviene. Il ciclo for potrebbe essere il problema, prova a usare un numero come 1 invece di 'records.count()' e vedi se ottieni ancora l'errore, prova a risolvere ogni area che può essere il problema. – Osman
fammi sapere cosa succede ... oppure puoi produrre la lunghezza dei record, se è troppo lungo provare a eseguire l'elaborazione sul thread precedente prima di portarlo sul thread principale ... – Osman
Grazie. non visualizza nulla ma mi dà '06-05 21: 27: 32.367: I/dalvikvm-heap (23426): Grow heap (caso frag) a 8.924 MB per allocazione 691216 byte ' – Copernic