Android maneja el cuadro de diálogo de progreso en una clase de tarea asíncrona separada

Esta es mi MainActivity, quiero manejar el diálogo de progreso en la clase AsyncTask, pero parece que pasar el contexto a asyncTask no funciona y la aplicación falla con el error NullPointerException, si intento configurar el progresoDialog en MainActivity, y luego obtengo una referencia a él en AsyncTask con mContext.progress, bloqueo de la aplicación con error WindowLeaked.

public class MainActivity extends Activity{

ConnectionHandler ch;
SearchForCard mTask = null;
String finalUrl = "";
Button searchBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ch = new ConnectionHandler(this);

    searchBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
                mTask = ch.new SearchForCard();
                mTask.execute(finalUrl);
            }

        }
    });

}

en mi clase ConnectionHandler, quiero crear una tarea asincrónica separada para cada cosa que tengo que hacer, por favor, no proporcione una solución para la tarea asincrónica interna en MainActivity, no es lo que quiero hacer

public class ConnectionHandler{

private MainActivity mContext;
Handler mHandler = new Handler();
Document doc = null;
Elements title = null;
String response = null;
ProgressDialog progress;

public ConnectionHandler(MainActivity ctx)
{
    mContext = ctx;

    progress = new ProgressDialog(mContext); <--APPLICATION CRASH HERE WITH DEBUGGER
    progress.setTitle("loading");
    progress.setIndeterminate(false);

}

public class SearchForCard extends AsyncTask<String, Void, Boolean> {


    @Override
    protected void onPreExecute() {

        progress.show();

        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... url) {

        try{
            doc = Jsoup.connect(url[0]).get();
            Log.d("RESPONSE",doc.toString());
        } catch (Exception e){
            e.printStackTrace();
        }

        return false;
    }

     @Override
        protected void onPostExecute(Boolean result) {

            super.onPostExecute(result);

            progress.dismiss();

        }
}
}

¿Qué estoy haciendo mal? Gracias

Este es el error:

02-08 12:40:28.275: E/WindowManager(3574): Activity com.pagiodevelop.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@5371c7b4 that was originally added here
02-08 12:40:28.275: E/WindowManager(3574): android.view.WindowLeaked: Activity com.pagiodevelop.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@5371c7b4 that was originally added here
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.Window$LocalWindowManager.addView(Window.java:547)
02-08 12:40:28.275: E/WindowManager(3574):  at android.app.Dialog.show(Dialog.java:277)
02-08 12:40:28.275: E/WindowManager(3574):  at com.pagiodevelop.ConnectionHandler$SearchForCard.onPreExecute(ConnectionHandler.java:40)
02-08 12:40:28.275: E/WindowManager(3574):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
02-08 12:40:28.275: E/WindowManager(3574):  at android.os.AsyncTask.execute(AsyncTask.java:534)
02-08 12:40:28.275: E/WindowManager(3574):  at com.pagiodevelop.MainActivity$1.onClick(MainActivity.java:50)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.View.performClick(View.java:4084)
02-08 12:40:28.275: E/WindowManager(3574):  at android.view.View$PerformClick.run(View.java:16966)
02-08 12:40:28.275: E/WindowManager(3574):  at android.os.Handler.handleCallback(Handler.java:615)
02-08 12:40:28.275: E/WindowManager(3574):  at android.os.Handler.dispatchMessage(Handler.java:92)
02-08 12:40:28.275: E/WindowManager(3574):  at android.os.Looper.loop(Looper.java:137)
02-08 12:40:28.275: E/WindowManager(3574):  at android.app.ActivityThread.main(ActivityThread.java:4745)
02-08 12:40:28.275: E/WindowManager(3574):  at java.lang.reflect.Method.invokeNative(Native Method)
02-08 12:40:28.275: E/WindowManager(3574):  at java.lang.reflect.Method.invoke(Method.java:511)
02-08 12:40:28.275: E/WindowManager(3574):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-08 12:40:28.275: E/WindowManager(3574):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-08 12:40:28.275: E/WindowManager(3574):  at dalvik.system.NativeStart.main(Native Method)

preguntado el 08 de febrero de 14 a las 12:02

¿Cómo y dónde instancias tu diálogo de progreso? -

llamar ch = nuevo ConnectionHandler(esto); en onCreate(), no antes de eso -

intente getapplicationcontext(); método -

usuario que he editado como dijiste, pero recibo un error de WindowLeaked, agregaré el código de error ahora -

@Mat, ¿lograste corregir el error? -

1 Respuestas

Esta debería ser la solución correcta cuando se usa el cuadro de diálogo de progreso y la tarea asíncrona

public static class SearchForCard extends AsyncTask<String, Void, Boolean> {

    private Context mContext;
    private ProgressDialog mProgress;

    public SearchForCard (Context context) {
        mContext = context;
    } 

    @Override
    protected void onPreExecute() {
        mProgress = new ProgressDialog(mContext);
        //customize the progress dialog here
        mProgress.setCancelable(false);
        mProgress.show();
    }

    @Override
    protected Boolean doInBackground(String... url) {
        //do your background work and return something
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (mProgress != null && mProgress.isShowing())
            mProgress.dismiss();

        //evaluate result
    }
}

contestado el 22 de mayo de 17 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.