java - sirve - poner progressbar en android studio
Error de ventanas filtradas con diálogo de progreso android (4)
Tengo un problema al mostrar un progress dialog
con una AsyncTask
:
Activity has leaked window com.android.internal.policy.PhoneWindow$DecorView{8cee959 V.E...... R......D 0,0-1026,252} that was originally added here
Esta es mi tarea Async:
public class MyClientTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog = null;
private Context mContext;
MyClientTask(Context mContext) {
this.mContext = mContext;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(mContext);
progressDialog.setMessage("Working ...");
progressDialog.setIndeterminate(false);
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
try {
wait(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}
}
}
Y esta es mi actividad:
public class ConnectionActivity extends Activity {
final private Context mContext = this;
private Button buttonConnect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R .layout.activity_socketconnection);
buttonConnect = (Button) findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(getConnectOncOnClickListener());
}
private OnClickListener getConnectOncOnClickListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
MyClientTask myClientTask = new MyClientTask(mContext);
try {
myClientTask.execute();
myClientTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
}
}
Busqué la solución, pero de todos modos no funciona
El problema es llamar a wait () en segundo plano. Por favor, eche un vistazo aquí .
Muestra:
private Object lock = new Object();
@Override
protected Void doInBackground(Void... arg0) {
synchronized(lock) {
try {
lock.wait(5000);
// Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
Esto generalmente ocurre cuando finaliza la actividad sin llamar a dismiss () u ocultar el diálogo primero. Le sugiero que vuelva a trabajar su código un poco, creando el ProgressDialog real en su Actividad y luego guardando una referencia al mismo. En su onDestroy (), como medida de precaución, compruebe si no es nulo y se muestra, luego desactívelo ().
Un par de consejos:
Guarde la referencia al
ProgressDialog
en su actividad y agregue los métodos públicos para mostrar / ocultarlo;Use un
WeakReference<Context>
en suAsyncTask
para dejar que el recolector de basura haga su trabajo;Deshágase de
myClientTask.get()
que bloquea el hilo de UI.
use progressDialog.cancel (); en lugar de progressDialog.dismiss ();
puedes encontrar la diferencia b / w aquí:
¿Cuál es la diferencia entre un diálogo que se descarta o cancela en Android?