Pracuję nad aplikacją, która powinna uzyskać odpowiedź JSON z usługi sieciowej i napisać każdy element z listy listview, czytałem, że powinienem pracować z AsyncTask, aby uzyskać odpowiedź HTTP i zrobiłem to i mogłem pobrać dane z usługi internetowej i wyświetlić je w TextViews. Ale gdy próbuję wyświetlić elementy w ListView nie wyświetla nic i daje mi się następujący komunikat w 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.
Pominięto 60 klatek! Aplikacja może wykonywać zbyt wiele pracy nad głównym wątkiem.
tu jest mój główny kod:
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);
}
}
}
}
}
Moja lista 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;
}
}
wreszcie SearchResults.java:
public class SearchResults {
private String address = "";
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
Co mam zrobić źle? Czy masz pomysł na ten temat?
Dziękuję.
To nie jest rozwiązanie, ale test, który może pomóc w ustaleniu, skąd pochodzi problem. To może być problem z pętlą, spróbuj użyć liczby podobnej do 1 zamiast 'records.count()' i sprawdź, czy nadal pojawia się błąd, po prostu spróbuj rozwiązać problem z każdym obszarem, który może być problemem. – Osman
daj mi znać, co się dzieje ... lub możesz wydrukować długość rekordów, jeśli jest zbyt długa, spróbuj wykonać przetwarzanie na wątku wstecz, zanim wprowadzisz go do głównego wątku ... – Osman
Dziękuję. nie wyświetla niczego, ale daje '06-05 21: 27: 32.367: I/dalvikvm-heap (23426): Rosną stertę (frag case) do 8.924MB dla 691216-bajtowej alokacji ' – Copernic