Android AsyncTask

Я полностью использую мой 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(); } } 

Вы должны обновить пользовательский интерфейс из метода 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 интерфейс LoadSingleViewHandler .

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

Для получения дополнительной информации

Example1

Example2

Вы можете найти еще много в Google 🙂

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

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

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