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();
}
}
}