Асинхронная задача Android

Полностью ли я использую свою AsyncTask? Может ли кто-нибудь исправить мои коды, если это неправильно. Я просто хочу убедиться, что моя AsyncTask полностью работает, чтобы у меня не было проблем в будущем. Я хочу использовать AsyncTask для всех своих классов. Это хорошая практика?

    public class SingleMenuItemActivity  extends Activity {

    // XML node keys
static final String KEY_TITLE = "title";
static final String KEY_ARTIST = "artist";  
static final String KEY_THUMB_URL = "thumb_url";
private ProgressDialog pDialog;
String title;
String artist;
String image_url;
ImageView view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.single_list_item);
        new loadSingleView().execute(); 


        view = (ImageView) findViewById(R.id.single_image);
    }


public class loadSingleView extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(
                    SingleMenuItemActivity.this);
            pDialog.setMessage("Connecting to Server ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        @Override
        protected String doInBackground(String... args) {
            // updating UI from Background Thread


            Intent in = getIntent();

            image_url = in.getStringExtra(KEY_THUMB_URL);
                        title = in.getStringExtra(KEY_TITLE);
            artist = in.getStringExtra(KEY_ARTIST);


            return null;

                    }
        @Override       
        protected void onPostExecute(String args) {
            // dismiss the dialog after getting all products

            ImageLoader imgLoader = new ImageLoader(getApplicationContext());

            imgLoader.DisplayImage(image_url, view);

            TextView lblName = (TextView) findViewById(R.id.name_title);
            TextView lblCost = (TextView) findViewById(R.id.name_artist);

            lblName.setText(title);
            lblCost.setText(artist);
            pDialog.dismiss();
        }
}

person Android Novice    schedule 17.08.2012    source источник


Ответы (4)


Вы должны обновить пользовательский интерфейс из метода onPostExecute(). Мне нравится перемещать мою задачу в их собственные файлы. Таким образом, у нас есть разделение проблем, что упрощает понимание кода. Мы можем сделать это, используя интерфейс для определения метода обратного вызова.

public class LoadSingleView extends AsyncTask<String, String, String> {

    public interface LoadSingleViewHandler {
        void onSingleViewLoad(String result);
    }

    private LoadSingleViewHandler handler;

    public LoadSingleView(LoadSingleViewHandler handler) {
        this.handler = handler;
    }

    @Override
    protected String doInBackground(String... args) {
        // Do operation here and return the result
        // Operation is usually some network request
        // or something that will take alot of time
    }

    @Override       
    protected void onPostExecute(String result) {
        handler.onSingleViewLoad(result);
    }
}

Теперь просто запустите задачу из действия, и действие реализует интерфейс LoadSingleViewHandler.

person Stefan Bossbaly    schedule 17.08.2012

Вы не можете обновить пользовательский интерфейс из потока Backgroud. Например, используйте doInBackground() для получения данных с сервера. Весь этот процесс будет выполняться в фоновом режиме. И onPostExecute для обновления пользовательского интерфейса после завершения фонового процесса.

Дополнительную информацию см. здесь

Пример 1

Пример 2

В гугле можно найти еще много :)

person Abhi    schedule 17.08.2012

Да, все операции пользовательского интерфейса должны выполняться в основном потоке, и точка. Вы можете загрузить изображение, которое хотите отобразить, в doInBackground(), обновить весь пользовательский интерфейс в onPostExecute().

Кроме того, рекомендуется убрать AsyncTask из своей деятельности. Это немного больше работы, но по мере того, как приложение становится больше и сложнее, оно сделает вашу жизнь проще. Вы можете использовать обработчики для передачи данных из AsyncTask в свои действия.

person Mus    schedule 17.08.2012

Выполнение в фоновом режиме должно в основном использоваться для тех задач, которые не должны выполняться в потоках пользовательского интерфейса, поэтому используйте его для подключения к серверу (API) для получения и отправки данных. Не используйте его без необходимости...

person Kartikey Kumar Srivastava    schedule 25.03.2015