Asyntask: ¿por qué actualizar el hilo de la interfaz de usuario en doInbackground se encontrará con el error?

cuando leí el documento sobre asyntask , dicen que: "no debería" actualizar el hilo de la interfaz de usuario en doInbackground porque doInbackground trabajo en hilo diferente.

esto significa: esta acción será peligrosa porque el subproceso de interfaz de usuario no es seguro para subprocesos. Yo lo entiendo. pero cuando intento para la prueba qué sucede cuando actualizo el hilo de la interfaz de usuario en esta función. Recibo el error: (pero el error no parece porque aysnchonize , pero porque NO PODEMOS hacerlo)

  (TextView)((Activity)context).findViewById(R.id.text)).setText("StackOverFlow"); //context: reference of context object of UI Thread 

Por favor, explique para mí. ¿No shouldn't o mustn't ?

Gracias 🙂

lo que he entendido hasta ahora con android es …,

no podemos actualizar el subproceso de la interfaz de usuario desde el subproceso de fondo. Puede que sea el caso que nos han detenido para actualizar la interfaz de usuario desde el hilo de fondo.

La razón de ello es muy claro … @ nivel OS habrá tantas hilo se ejecutará.

Y también hilo diferente de aplicación diferente , Y en ese caso Será el caos en la pantalla, si podemos actualizar la interfaz de usuario de bg-hilo

Dentro del doInBackgroundyou no obtendrá el acceso de la interfaz de usuario. Si usted desea tomar el acceso de la UI publishProgress de doInBackgroundyou irá al onProgressUpdate de allí hace lo que usted wan para demostrar en UI.

Debajo está el código que usted comprobará para su referencia:

class DescargarAsyncTask extends AsyncTask {

  ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(Login.this, "", "Please Wait ..."); } @Override protected Void doInBackground(String... arg0) { int status1 = validationuser(username); Log.i("MyLog", "Inside the doInBackground is came"+status1); if(status1 == 1) { publishProgress(status1+ "Valid User Code","1",""+status1); } else { publishProgress(status1+ " Invalid Valid User Code","0",""+status1); } return null; } @Override protected void onProgressUpdate(String...values){ super.onProgressUpdate(values); int index = Integer.parseInt(values[2]); if(index == 1) { USERIDLOGIN = edittextuserName.getText().toString(); Intent intent=new Intent(Login.this, CollectionModuleandDownload.class); /*Toast.makeText(Login.this, "Valid User Password", Toast.LENGTH_SHORT).show();*/ startActivity(intent); progressDialog.dismiss(); } else { Toast.makeText(Login.this, "Invalid Username & Password", Toast.LENGTH_SHORT).show(); progressDialog.dismiss(); } } @Override protected void onPostExecute(Void result){ super.onPostExecute(result); /*if(progressDialog != null) { progressDialog.dismiss(); }*/ } } 

por lo que tiene que actualizar ui sólo en OnPostExecute & OnPreExecute. aquí hay un buen ejemplo de asynctask. darle una oportunidad

lo llamas por

 new SaveProfile().execute(); 

luego esto…

 private class SaveProfile extends AsyncTask<String, Void, Boolean>{ @Override protected Boolean doInBackground(String... params) { //---------- so your stuff here.... non ui related Log.v("response from saving",response); if(response.equals("1")){ return true; }else{ return false; } } protected void onPostExecute(Boolean result) { if(result) { //------ UPDATE UI HERE Toast.makeText(ProfileCompanyActivity.this, "profile saved", 2500).show(); }else{ Toast.makeText(ProfileCompanyActivity.this, "an error occured", 2500).show(); } } } 

Cuando crea una tarea de doInBackground método doInBackground se ejecuta en el subproceso separado del subproceso de UI. Por lo tanto, no puede actualizar la interfaz de usuario de este método.

El método OnPostExecute y onPreExecute se ejecutan en el mismo subproceso que el subproceso de UI. Para leer más aquí

Si solo se permite que un hilo toque la interfaz de usuario, Android puede garantizar que nada vital se cambia mientras se miden las vistas y las renderizan a la pantalla. Es porque .. La interfaz de usuario puede actualizarse solo en mainthread … todos los objetos de interfaz de usuario en su pantalla son mantenidos por este mainthread …. ahora si intenta cambiar la interfaz de usuario de algún otro hilo (hacer en el fondo) en este caso .. que causa error, porque .. por ejemplo .. si intenta cambiar el valor de seekbar (algún widget) de otro que el hilo principal .. y el usuario está tratando de poner un valor diferente … entonces es ambiguo para android .. en cuanto a qué hilo debe escuchar … espero que aclare su duda ..

Por lo tanto, es como no deberíamos tratar de .. y debido a su seguridad .. no podemos tratar también .. ya que da error .. =]

doInBackground se utiliza para realizar cálculos pesados ​​o cualquier trabajo de fondo que desee realizar en su actividad. cuando la operación en su método doinbackground terminó en los métodos postexecute upadates su ui .. en breve doinbackground no se utiliza para actualizar ui.

Creo que la respuesta es que no debemos

Simplemente no parece lógico para mí .. es como tratar de cambiar la estación de radio en otro coche conduciendo junto a usted .. la arquitectura no funciona de esa manera .. usted puede decidir en una estación de radio antes de salir a su viaje por carretera o cuando deje de conducir y teóricamente puede gritarle y pedirle que cambie la estación, pero no puede hacerlo usted mismo.

Como doInBackground () se ejecuta en hilos separados y onPostExecute se ejecuta en hilo UIMain y como por restricción proporcionada por Android no se puede actualizar UIMain Thread de otro hilo.

Debido a la razón mencionada arriba usted está recibiendo mensaje mencionado mientras que usted está funcionando su uso.

  • Async tarea no funciona correctamente (doInBackground no se ejecuta) cuando el servicio se ejecuta en segundo plano, Android
  • ¿Cómo puedo pasar objetos ejecutables a un manejador?
  • Manejadores inicializados con Looper.getMainLooper () no responde a callbacks de mensaje
  • ¿El mejor método para roscar en Android?
  • Limitar el rendimiento con RxJava
  • RxJava Multithreading con Realm - Acceso al dominio desde un subproceso incorrecto
  • ¿Se matará el hilo antes de que finalice la actividad en Android?
  • ¿Cuál es la forma preferida de volver a llamar a una actividad de Android desde un subproceso de servicio
  • PARTIAL_WAKE_LOCK vs SCREEN_DIM_WAKE_LOCK en el subproceso de descarga
  • Lanzar null pointerException en Timer.Schedule ();
  • Android: ¿Cómo usar Gottox / socket.io-java-cliente de la biblioteca con la forma correcta?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.