Reputation: 546
Am i fully utilising my AsyncTask? Can someone correct my codes if it is wrong. I just want to make sure my AsyncTask fully works so i wont get any trouble in the future. I wish to use AsyncTask for all my classes. Is it a good practice?
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();
}
}
Upvotes: 4
Views: 976
Reputation: 1776
Do in background must mainly be used for those tasks that must not be performed on UI threads so Use it for connecting to server(API's) to receive and send data. Dont use it without necessity...
Upvotes: 0
Reputation: 6794
You have to update the UI from the method onPostExecute()
. I like to move my task into their own files. This way we have a separation of concerns which makes it more easier to understand the code. We can do this by using a interface to define a callback method
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);
}
}
Now just start the task from the activity and have the activity implement LoadSingleViewHandler
interface.
Upvotes: 3
Reputation: 1860
Yes, all UI operations have to be done on the main thread, period. You can download the image you want to display in doInBackground(), update the entire UI in onPostExecute().
Also, it's a good practice to move the AsyncTask out of your activity. It is a little more work, but as the app becomes bigger and more complicated, it will make your life easier. You can use handlers to pass data from AsyncTask to your activities.
Upvotes: 0
Reputation: 9005
You cant update the UI from Backgroud thread. For example Use doInBackground()
to get data from server.All this process will be done in Background.And onPostExecute
is to update the UI after background process is over
You can find many more in Google :)
Upvotes: 4