thread studio hilos funciona example doinbackground create como asynctask android multithreading android-asynctask

android - studio - asynctask vs thread



Asyntask: ¿por qué actualizar UI Thread en doInbackground se encontrará con un error? (8)

Como doInBackground () se ejecuta en subprocesos independientes y onPostExecute se ejecuta en subprocesos de UIMain y, según la restricción proporcionada por Android, no puede actualizar UIMain Thread desde otro subproceso.

Debido a la razón mencionada anteriormente, recibirá un mensaje mencionado mientras ejecuta su aplicación.

cuando leo un documento sobre asyntask , dicen que: "no debería" actualizar el subproceso de IU en doInbackground porque doInbackground funciona en un subproceso diferente.

eso significa: esta acción será peligrosa porque UI Thread no es seguro para subprocesos. Yo lo entiendo. pero cuando intento hacer una prueba, ¿qué ocurre cuando actualizo UI Thread en esta función? Recibo el error: (pero el error no se parece a aysnchonize , sino porque NO PODEMOS hacerlo)

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

Por favor explique por mi No shouldn''t o mustn''t .

Gracias :)


Creo que la respuesta es que no debemos

Simplemente no me parece lógico ... es como tratar de cambiar la estación de radio en otro automóvil que conduce a tu lado ... la arquitectura simplemente no funciona de esa manera ... puedes elegir una estación de radio antes de partir a su viaje por carretera o cuando deja de conducir y teóricamente puede gritarle y pedirle que cambie la estación pero no puede hacerlo usted mismo.


Cuando crea una tarea doInBackground método doInBackground se ejecuta en el subproceso separado del subproceso de interfaz de usuario. Entonces no puedes actualizar la UI desde este método.

Los OnPostExecute y onPreExecute se ejecutan en el mismo subproceso que el subproceso de interfaz de usuario. Para leer más ir aquí


Dentro del doInBackground no obtendrás acceso a la UI. Si desea tener acceso a la interfaz de usuario publireprogreso desde doInBackground, irá a onProgressUpdate desde allí y hará lo que quiera mostrar en la interfaz de usuario.

A continuación se muestra el código que comprobará para su referencia:

La clase DownloadAsyncTask extiende 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(); }*/ } }


Si solo se permite un subproceso para tocar la interfaz de usuario, Android puede garantizar que no se cambie nada vital mientras se miden las vistas y se visualizan en la pantalla. Es porque ... La interfaz de usuario solo se puede actualizar en el hilo principal ... todos los objetos de la interfaz de usuario en su pantalla se mantienen con este hilo principal ... ahora si intenta cambiar la interfaz de usuario desde otro hilo (haga en segundo plano) en este caso ... causa un error porque ... por ejemplo ... si intenta cambiar el valor de la barra de búsqueda (algunos artilugios) que no sea 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 ..

Entonces, es como si no deberíamos intentar ... y debido a su seguridad ... no podemos intentarlo también ... ya que da error .. =]


doInBackground se utiliza para realizar cálculos pesados ​​o cualquier trabajo en segundo plano que desee realizar en su actividad. cuando la operación en su método de doinbackground finalizó en los métodos posteriores a la ejecución upadates ui ... en resumen doinbackground no se usa para actualizar ui.


lo que he entendido hasta ahora con Android es ...,

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

La razón para eso es muy clara ... @ nivel OS habrá tantos subprocesos se ejecutará.

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


por lo que debe actualizar ui solo en OnPostExecute y 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(); } } }