2015-08-10 3 views
-2

У меня возникли проблемы с настройкой адаптера для моего списка в асинхронной задаче. У меня есть два варианта: один, если на устройстве есть интернет, а другой - нет. Если интернет идет напрямую, чтобы искать то, что мне нужно для владения веб-сервисом, тогда как если нет интернета, он просматривает мою локальную базу данных. Второй случай отлично работает и выходит из асинхронной задачи. К сожалению, первый случай, Интернет, задача не удалась, но не вышла. Я оставляю свой код, поскольку я знал, что не могу играть с представлением в рамках асинхронной задачи, но мой вопрос в том, почему он работает, если нет Интернета?установить адаптер в 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 
+0

См. «08-10 09: 54: 31.837: E/AndroidRuntime (7417): причиненный: android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений. вы пытаетесь обновить пользовательский интерфейс из фонового потока. – Rohit5k2

+2

вы не можете установить адаптер в фоновом потоке. Только по основной теме. Установите его в onPostExecute или с помощью runOnUiThread или с помощью Handler –

+0

@ VladMatvienko. Что у меня более чем понятно, но, как я сказал, он будет работать в одном случае? – NHTorres

ответ

1

Первое:

Это línea плохо.

adapter = new CustomListViewAdapter(this,R.layout.lista_validacion_multiple, rowItems); 

У вас есть это, но должен быть ваш контекст aplicación Я не очень хорошо знаю свой код, но изменить это:

адаптер = новый CustomListViewAdapter (ValidacionMultiple.this, R.layout.lista_validacion_multiple, rowItems);

И второе:

Ваше сусло, что в пост выполнить метод, в этом методе вы можете получить доступ к главному потоку.

С уважением.

+1

Спасибо, я понял это и хорошо работает! Спасибо! – NHTorres

+0

Хорошо, доволен этим. Пожалуйста, отметьте ответ, принятый для включения темы обсуждения. С уважением. –

Смежные вопросы