Замораживание индикатора ProgressDialog в AsyncTask с OnItemClickListener - PullRequest
0 голосов
/ 28 марта 2011

У меня есть следующий код, в котором информация об изображениях загружается из БД и отображается в пользовательском представлении галереи.Проблема в том, что я не вижу способа поместить параметр OnItemClickListener для галереи в фоновый поток AsyncTask, поскольку он является частью основного потока пользовательского интерфейса (я думаю?)Когда я загружаю Activity, диалоговое окно появляется, но зависает, и я думаю, что это потому, что я устанавливаю OnItemClickListener в потоке пользовательского интерфейса, который требует много работы.Как я могу решить эту проблему?

private class loadTask extends AsyncTask<String, Integer, String>{

        ProgressDialog dialog = new ProgressDialog(ActivityGallery.this);

        @Override 
        protected void onPreExecute(){
            b = getIntent().getExtras();

            dialog.setMessage("Loading..."); 
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params) {


            Log.v("SC", "ASYNC GETS HERE!!");
            DBHandler handler = new DBHandler(ActivityGallery.this);
            SQLiteDatabase db = handler.getReadableDatabase();

            Cursor c = db.rawQuery("SELECT * FROM images", null);
            if (c.moveToFirst()) {
                do {
                    paths.add(c.getString(1));
                    Log.v("SC", "Cursor: " + c.getString(1)); 
                } while (c.moveToNext());
            } 

            c.close();
            db.close();
            handler.close();
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... s){

        }

        @Override
        protected void onPostExecute(String result){
            Log.v("SC", "Final Paths: " + paths.toString());

            setContentView(R.layout.gallery);

            gallery = (Gallery) findViewById(R.id.gallery1); 
            gallery.setAdapter(new ImageAdapter(ActivityGallery.this));
            gallery.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v, int position,
                        long id) {
                    selected_image_position = position; 
                    GoToShareActivity();
                }
            });     
            dialog.dismiss();
        }
     }

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Что делает GoToShareActivity ()?

Если это еще одна ресурсоемкая операция, то диалоговое окно будет зависать.Это потому, что onPostExecute () работает в потоке пользовательского интерфейса.

У меня есть аналогичная программа, которая использует asynctask, как вы.Я попытался поместить свой onItemClickListener () в onPostExecute, но он не останавливает диалог, так как я не выполняю в нем никаких тяжелых процессов.Я понимаю ту часть, в которой вы хотите показать галерею пользователю после закрытия диалогового окна.

ОТВЕТ: Вы можете сделать gallery.setOnItemClickListener (), но фактическое выполнение onClick ()не быть там.

@Override
public void onCreate(Bundle savedInstanceState)
{
    setContentView(R.layout.gallery); //place before your loadTask()
    .
    . //your other implementations
    .
}

private OnItemClickListener galleryOnItemClickListener = new OnItemClickListener()
{
    @Override
    public void onClick(View v)
    {
        selected_image_position = position; 
        GoToShareActivity();
    }
};

private class loadTask extends AsyncTask<String, Integer, String>
{
    .
    .
    .

    protected void onPostExecute(String result)
    {
        Log.v("SC", "Final Paths: " +paths.toString());

        gallery = (Gallery)findViewById(R.id.gallery1);
        gallery.setAdapter(new ImageAdapter(ActivityGallery.this));
        gallery.setOnItemClickListener(galleryOnItemClickListener);

        dialog.dismiss();
    }
}
0 голосов
/ 07 апреля 2011

Я думаю, что GoToShareActivity () вызывает зависание. Проверьте эту функцию подробно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...