Используйте ProgressDialog в классе AsyncTask - PullRequest
0 голосов
/ 21 марта 2012

Я разрабатываю свое первое приложение для Android. Я пробовал каждый фрагмент кода, который я нашел на этой странице и других. Что ж, моя проблема заключается в необходимости входа пользователя в систему с помощью интернет-службы, поэтому я использую класс AsyncTask, но когда я попытался добавить ProgressDialog в фоновый метод, это диалоговое окно показало только секунду спустя, когда фоновый метод завершил работу. Похоже, пользовательский интерфейс заблокирован во время работы фонового процесса.

Это код моей деятельности и асинхронный класс.

public class PanelAdministracion extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.paneladministracion);
    try {
        Bundle datos = this.getIntent().getExtras();
        Map<String,String> credenciales = new HashMap<String,String>();
        credenciales.put("usuario", datos.getString("usuario"));
        credenciales.put("password", datos.getString("password"));
        new ObtenerDatos().execute(credenciales,null,null).get();
        MyPagerAdapter adapter = new MyPagerAdapter(this);
        ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(0);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

private class ObtenerDatos extends AsyncTask< Map<String,String>, Void, Void>{

    protected ProgressDialog progressDialog;
    private final static String TAG = "LoginActivity.EfetuaLogin";

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.v(TAG, "Executando onPreExecute de EfetuaLogin");
        //inicia diálogo de progresso, mostranto processamento com servidor.
        progressDialog = ProgressDialog.show(PanelAdministracion.this, "Autenticando", "Contactando o servidor, por favor, aguarde alguns instantes.", true, false);
    }

    @Override
    protected Void doInBackground(Map<String,String>... params) {
        Log.d(TAG, "Executando doInBackground de EfetuaLogin");
        try {
            if(Usuario.login(params[0].get("usuario"), params[0].get("password"))){
                Usuario.obtenerNotificaciones();
                Usuario.obtenerPeliculas();
                Usuario.obtenerSeries();
            }else{
                Intent volver = new Intent(PanelAdministracion.this,SerieslyActivity.class);
                PanelAdministracion.this.startActivity(volver);
            }
        } catch (NotSignInException e) {
             e.printStackTrace();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } catch (DOMException e) {
            e.printStackTrace();
        } catch (GetDataSerieException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
    }
}

}

Спасибо всем за помощь!

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Корневая точка, из-за которой ваш блок пользовательского интерфейса блокируется:

new ObtenerDatos().execute(credenciales,null,null).get();

Вызывая AsyncTask.get (), вы фактически блокируете поток пользовательского интерфейса и ожидаете рабочий поток (AKA. AsyncTask.doInBackground()) заканчивать.иными словами, благодаря этому AsyncTask работает синхронно с потоком пользовательского интерфейса.Попробуйте использовать:

new ObtenerDatos().execute(credenciales,null,null);

Надеюсь, это поможет.

0 голосов
/ 22 марта 2012

Я бы порекомендовал что-то подобное ...

public class PanelAdministracion extends Activity {

private ProgressDialog mProgressDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.paneladministracion);
    try {
        Bundle datos = this.getIntent().getExtras();
        Map<String,String> credenciales = new HashMap<String,String>();
        credenciales.put("usuario", datos.getString("usuario"));
        credenciales.put("password", datos.getString("password"));

        // Keep progressDialog outside of AsyncTask...
        // This all could be put in a separate method to clean things up...
        mProgressDialog = ProgressDialog.show(PanelAdministracion.this, "Autenticando", "Contactando o servidor, por favor, aguarde alguns instantes.", true, false);

        new AsyncTask<Map<String,String>, Void, Void>()
        {
            @Override
            protected Void doInBackground(Map<String,String>... params) {
                // Your other code goes here...
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);

                mProgressDialog.dismiss();
            }

        }.execute(credenciales);


        MyPagerAdapter adapter = new MyPagerAdapter(this);
        ViewPager myPager = (ViewPager) findViewById(R.id.myfivepanelpager);

        myPager.setAdapter(adapter);
        myPager.setCurrentItem(0);

    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

}
0 голосов
/ 21 марта 2012

-> protected ProgressDialog progressDialog;

Написать эту строку на уровне класса ..

...