我是否充分利用了异步任务?如果我的密码错了,有人能纠正吗?我只想确保我的异步任务完全工作,这样以后就不会有任何麻烦了。我希望对所有类使用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()方法更新ui。我喜欢把我的任务转移到他们自己的文件里。这样我们就有了关注点的分离,这使得理解代码更加容易。我们可以使用接口来定义回调方法

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

现在只需从activity启动任务,并使用activity implementLoadSingleViewHandler接口。

07-24 09:47
查看更多