0


我有一个 AsyncTask 那么多 rss 信息,然后将它应用到 UI。我有一个加载过程的指示器,当它在后台加载信息时,UI 运行顺利,但是当我调用 PublishProgress() 以便我可以编辑 UI 时,指示器冻结。这里有一些代码可以更好地解释它:

                class LoadRss extends AsyncTask<Void, Void, Void> {
                    protected Void doInBackground(Void...voids) {
                        changeRSS(checkedId);
                        publishProgress();
                        return null;
                     }
                    protected void onPostExecute(Void voids) {

                        frameAnimation.stop();
                        syncHomeSymbol.setImageResource(R.drawable.none);
                        syncHomeSymbol.setBackgroundColor(color.background_dark);
                     }
                    @Override
                    protected void onProgressUpdate(Void... values) {
                        super.onProgressUpdate(values);
                        InitHome();
                        }
                }
            new LoadRss().execute();

changeRSS 是提取 RSS 信息的方法。
InitHome 是改变 UI 的方法。


非常感谢你!

初始化主页

private void InitHome() {
if (isNetworkAvailable()) {
    homeLayout.removeAllViews();
    int enclosureCounter = 0;
        for (int i=0;i<rssRes.getLength();i++) {
            String title;
                final String link;
                String description, pubDate;
            EnclosureItem enclosure;
            title = rssRes.getTitle()[i];
            link = rssRes.getLink()[i];
            description = rssRes.getDescription()[i];
            pubDate = rssRes.getPubDate()[i];
            try {
                enclosure = rssRes.getEnclosure().get(enclosureCounter);
            if (enclosure.getPos() == i) {
                LinearLayout horizontal = new LinearLayout(this);
                horizontal.setOrientation(LinearLayout.HORIZONTAL);
                horizontal.setBackgroundResource(R.drawable.rounded_layout);
                LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                p.setMargins(10, 10, 10, 10);
                horizontal.setLayoutParams(p);
                horizontal.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {
                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
                        startActivity(browserIntent);
                        }
                    });
                ImageView img = new ImageView(this);
                Drawable drawable = LoadImageFromWebOperations(enclosure.getUrl());
                img.setImageDrawable(drawable);
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(120, LinearLayout.LayoutParams.FILL_PARENT);
                img.setLayoutParams(layoutParams);
                img.setScaleType(ScaleType.CENTER_CROP);
                horizontal.addView(img);
                LinearLayout vertical = new LinearLayout(this);
                vertical.setOrientation(LinearLayout.VERTICAL);

                TextView textTitle = new TextView(this);
                if (SPM.getFix()) {
                    textTitle.setGravity(Gravity.LEFT);
                }
                else {
                    textTitle.setGravity(Gravity.RIGHT);
                }
                textTitle.setTextSize(1, 18);
                textTitle.setText(Html.fromHtml("<font color='#92b64a'>"+title+"</font><br />"));
                vertical.addView(textTitle);

                TextView textDescription = new TextView(this);
                    if (SPM.getFix()) {
                        textDescription.setGravity(Gravity.LEFT);
                    }
                    else {
                        textDescription.setGravity(Gravity.RIGHT);
                    }
                    String str = Html.fromHtml(description).toString();
                    try{
                        str = str.substring(0,str.lastIndexOf("\n\n"));
                    }
                    catch (IndexOutOfBoundsException e) { }
                    textDescription.setText(Html.fromHtml(new RssOrganizer(str,false).getDescription()));
                vertical.addView(textDescription);

                TextView textpubDate = new TextView(this);
                if (SPM.getFix()) {
                    textpubDate.setGravity(Gravity.LEFT);
                }
                else {
                    textpubDate.setGravity(Gravity.RIGHT);
                }
                textpubDate.setText(new RssOrganizer(pubDate,true).getPubDate()+"\n\n");
                vertical.addView(textpubDate);
                enclosureCounter++;
                horizontal.addView(vertical);
                homeLayout.addView(horizontal);
            }
            else {
                setRegHome(i);
            }
        }
            catch (IndexOutOfBoundsException e) {
                setRegHome(i);
        }
        }
}

else
{
        tRSS.setText(R.string.noINNERinternetConnection);
}   
}

private void setRegHome(int i) {

    String title;
    final String link;
    String description, pubDate;
    title = rssRes.getTitle()[i];
    link = rssRes.getLink()[i];
    description = rssRes.getDescription()[i];
    pubDate = rssRes.getPubDate()[i];
    LinearLayout vertical = new LinearLayout(this);
    vertical.setOrientation(LinearLayout.VERTICAL);
    vertical.setBackgroundResource(R.drawable.rounded_layout);
    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    p.setMargins(10, 10, 10, 10);
    vertical.setLayoutParams(p);
    vertical.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
            startActivity(browserIntent);   
        }
    });
    TextView textTitle = new TextView(this);
        if (SPM.getFix()) {
            textTitle.setGravity(Gravity.LEFT);
        }
        else {
            textTitle.setGravity(Gravity.RIGHT);
        }
        textTitle.setTextSize(1, 18);
        textTitle.setText(Html.fromHtml("<font color='#92b64a'>"+title+"</font><br />"));
        vertical.addView(textTitle);

        TextView textDescription = new TextView(this);
            if (SPM.getFix()) {
                textDescription.setGravity(Gravity.LEFT);
            }
            else {
                textDescription.setGravity(Gravity.RIGHT);
            }
            String str = Html.fromHtml(description).toString();
            try{
                str = str.substring(0,str.lastIndexOf("\n\n"));
            }
            catch (IndexOutOfBoundsException e) { }
        textDescription.setText(Html.fromHtml(new RssOrganizer(str,false).getDescription()));
        vertical.addView(textDescription);

        TextView textpubDate = new TextView(this);
        if (SPM.getFix()) {
            textpubDate.setGravity(Gravity.LEFT);
        }
        else {
            textpubDate.setGravity(Gravity.RIGHT);
        }
        textpubDate.setText(new RssOrganizer(pubDate,true).getPubDate()+"\n\n");
        vertical.addView(textpubDate);
        homeLayout.addView(vertical);
    }
4

1 回答 1

1

onProgressUpdate(...)在 UI 线程上运行,因此它不应该做很多耗时的工作——这首先会破坏 AsyncTask 的使用。

理想情况下onProgressUpdate(...),应该简单地提供基本的进度更新,例如完成百分比或指示进度的简单文本消息。

All views used to show progression should be created beforehand however, many people use onPreExecute() for this.

于 2012-04-07T23:10:32.900 回答