У меня возникли проблемы с настройкой адаптера для моего списка в асинхронной задаче. У меня есть два варианта: один, если на устройстве есть интернет, а другой - нет. Если интернет идет напрямую, чтобы искать то, что мне нужно для владения веб-сервисом, тогда как если нет интернета, он просматривает мою локальную базу данных. Второй случай отлично работает и выходит из асинхронной задачи. К сожалению, первый случай, Интернет, задача не удалась, но не вышла. Я оставляю свой код, поскольку я знал, что не могу играть с представлением в рамках асинхронной задачи, но мой вопрос в том, почему он работает, если нет Интернета?установить адаптер в listView в asynctask
private class cargarListaInscripciones extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ValidacionMultiple.this);
pDialog.setMessage("Cargando...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (pDialog.isShowing())
pDialog.dismiss();
}
@Override
protected Void doInBackground(Void... arg0) {
cargarVista();
return null;
}
}
Функция: Интернет
public void cargarVista(){
SessionManager manager = new SessionManager();
rut_inscripcion = manager.getValue(this, "rut_inscripcion");
nombreCliente = manager.getValue(this, "nombreCliente");
user = manager.getValue(this, "nombreUser");
folioEvento = manager.getValue(this, "folioEvento");
codigoEvento = manager.getValue(this, "codigoEvento");
seleccionValidadora = manager.getValue(this, "opcionVerificadora");
nombreUser = manager.getValue(this, "nombreUser");
hashUser = manager.getValue(this, "hashUsuario");
listView = (ListView) findViewById(R.id.listView1);
Connection cn = new Connection();
JSONObject json = new JSONObject();
BaseDeDatos nueva = new BaseDeDatos();
if(cn.isNetworkAvailable(ValidacionMultiple.this) || seleccionValidadora.equals("Mixto")){
urls = Config.URL_BASE + nombreCliente + "/"
+ Config.URL_VALIDACION_RUT_ARRAY + nombreUser + "/"
+ hashUser + "/" + folioEvento + "/" + rut_inscripcion;
if (manager.getValue(ValidacionMultiple.this,"checkin") != null) {
id_checkin = nueva.idCheckin(ValidacionMultiple.this, manager.getValue(ValidacionMultiple.this,"checkin"));
urls = urls + id_checkin;
}
System.out.println(urls);
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(urls);
post.setHeader("content-type", "application/json");
try {
JSONObject dato = new JSONObject();
StringEntity entity = new StringEntity(dato.toString());
post.setEntity(entity);
HttpResponse resp = httpClient.execute(post);
String respStr = EntityUtils.toString(resp.getEntity());
JSONObject respJSON = new JSONObject(respStr);
json = respJSON;
} catch (Exception ex) {
Log.e("ServicioRest", "Error!", ex);
}
System.out.println("JSON: " + json);
try {
JSONArray array = json.getJSONArray("Inscripciones");
for (int i = 0; i < array.length(); i++) {
JSONObject inscripcion = (JSONObject) array.get(i);
RowItem item = new RowItem(inscripcion.getString("nombre"),inscripcion.getString("ticket"), inscripcion.getString("asiento") , inscripcion.getString("numero"),images[0] , Integer.parseInt(inscripcion.getString("inscripcion_id")), inscripcion.getString("hash"), Integer.parseInt(inscripcion.getString("validado")));
rowItems.add(item);
}
adapter = new CustomListViewAdapter(this,R.layout.lista_validacion_multiple, rowItems);
//Line 141
listView.setAdapter(adapter);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
//Modo local o mixto.
rowItems = nueva.getInscripcionsByRut(this, rut_inscripcion);
adapter = new CustomListViewAdapter(this,R.layout.lista_validacion_multiple, rowItems);
listView.setAdapter(adapter);
}
}
Ошибка:
08-10 09:54:31.837: E/AndroidRuntime(7417): FATAL EXCEPTION: AsyncTask #1
08-10 09:54:31.837: E/AndroidRuntime(7417): java.lang.RuntimeException: An error occured while executing doInBackground()
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.os.AsyncTask$3.done(AsyncTask.java:299)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.lang.Thread.run(Thread.java:856)
08-10 09:54:31.837: E/AndroidRuntime(7417): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5404)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1076)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4175)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.view.View.invalidate(View.java:10894)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.view.View.invalidate(View.java:10849)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.widget.AbsListView.resetList(AbsListView.java:2290)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.widget.ListView.resetList(ListView.java:511)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.widget.ListView.setAdapter(ListView.java:451)
08-10 09:54:31.837: E/AndroidRuntime(7417): at com.google.zxing.client.android.ValidacionMultiple.cargarVista(ValidacionMultiple.java:141)
08-10 09:54:31.837: E/AndroidRuntime(7417): at com.google.zxing.client.android.ValidacionMultiple$cargarListaInscripciones.doInBackground(ValidacionMultiple.java:87)
08-10 09:54:31.837: E/AndroidRuntime(7417): at com.google.zxing.client.android.ValidacionMultiple$cargarListaInscripciones.doInBackground(ValidacionMultiple.java:1)
08-10 09:54:31.837: E/AndroidRuntime(7417): at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-10 09:54:31.837: E/AndroidRuntime(7417): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
08-10 09:54:31.837: E/AndroidRuntime(7417): ... 4 more
См. «08-10 09: 54: 31.837: E/AndroidRuntime (7417): причиненный: android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. вы пытаетесь обновить пользовательский интерфейс из фонового потока. – Rohit5k2
вы не можете установить адаптер в фоновом потоке. Только по основной теме. Установите его в onPostExecute или с помощью runOnUiThread или с помощью Handler –
@ VladMatvienko. Что у меня более чем понятно, но, как я сказал, он будет работать в одном случае? – NHTorres