4

我是否充分利用了我的 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();
        }
}
4

4 回答 4

4

您无法从 Backgroud 线程更新 UI。例如用于doInBackground()从服务器获取数据。所有这些过程都将在后台完成。并且 onPostExecute是在后台进程结束后更新 UI

欲了解更多信息在这里学习

示例 1

示例 2

您可以在 Google 中找到更多内容:)

于 2012-08-17T15:25:25.793 回答
3

您必须从方法更新 UI 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接口。

于 2012-08-17T16:39:57.053 回答
0

Do in background 必须主要用于那些不能在 UI 线程上执行的任务,因此将其用于连接到服务器(API)以接收和发送数据。不要在没有必要的情况下使用它...

于 2015-03-25T23:26:32.660 回答
0

是的,所有 UI 操作都必须在主线程上完成。您可以在 doInBackground() 中下载要显示的图像,在 onPostExecute() 中更新整个 UI。

此外,最好将 AsyncTask 移出您的活动。这是一个多一点的工作,但随着应用程序变得更大和更复杂,它会让你的生活更轻松。您可以使用处理程序将数据从 AsyncTask 传递到您的活动。

于 2012-08-17T15:30:56.543 回答