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)
- Cómo enlazar una actividad a un servicio y controlar y administrar el servicio desde la actividad
- Android AsyncTask vs hilo + controlador vs rxjava
- Matando un hilo en java android
- Tacto largo en una superficieView (android)
- Prueba de unidades de Android con ContentProviders
(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 🙂
- Android Video View en otro hilo y problema con android 2.1
- Es la biblioteca Java.util.concurrent mejor al hacer cualquier tipo de tarea sobre el estándar Android AsyncTask
- Android VideoView setVideoURI bloquea el subproceso de la interfaz de usuario
- Cómo pasar en dos tipos de datos diferentes a AsyncTask, Android
- Handler.sendMessageDelayed (msg, delay) no funciona correctamente
- Android: ¿Cuál es la forma más suave de sincronizar una base de datos remota en segundo plano?
- Sincronizar varias ventanas con varias vistas en Android
- Método de servicio de Android llamado en hilo diferente. ¿Sigue funcionando en el hilo principal?
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.
- crear un cuadro delimitador alrededor del punto geográfico
- ¿Cómo automatizar el mecanismo de instantánea DDMS?