【发布时间】:2015-08-10 13:17:58
【问题描述】:
我在如何在异步任务中为我的列表视图设置适配器时遇到问题。我有两种选择:一种是设备上有互联网,另一种是没有。如果互联网直接搜索我需要拥有的 Web 服务,而如果没有互联网,则查看我的本地数据库。第二种情况在异步任务内外都很好用。不幸的是,第一种情况,Internet,任务失败但没有退出。我留下我的代码,因为我知道我无法在异步任务中使用视图,但我的问题是,如果没有互联网,为什么它可以工作?
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): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.很可能您正在尝试从后台线程更新 UI。 -
您不能在后台线程中设置适配器。仅在主线程上。在onPostExecute中设置,或者使用runOnUiThread,或者使用Handler
-
@VladMatvienko 我有什么很清楚的,但正如我在那里所说的那样,它适用于一个案例?
标签: android listview asynchronous android-asynctask