studio sirve que progressbar progreso poner para pantalla llenar implementar espera como carga barra java android android-asynctask progressdialog

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:

  1. Guarde la referencia al ProgressDialog en su actividad y agregue los métodos públicos para mostrar / ocultarlo;

  2. Use un WeakReference<Context> en su AsyncTask para dejar que el recolector de basura haga su trabajo;

  3. Deshágase de myClientTask.get() que bloquea el hilo de UI.