4

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();
        }
}
4

4 に答える 4

4

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

For more info Study here

Example1

Example2

You can find many more in Google :)

于 2012-08-17T15:25:25.793 に答える
3

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.

于 2012-08-17T16:39:57.053 に答える
0

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.

于 2012-08-17T15:30:56.543 に答える
0

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...

于 2015-03-25T23:26:32.660 に答える