RE6
RE6

Reputation: 2724

AsyncTask freezes UI


I have an AsyncTask that much many rss info, and then applying it to the UI. I have an indicator for the loading proccess, and while it loads the info in background the UI runs smoothly, but when I call PublishProgress() so I can edit the UI, the indicator freezes. Here's a bit of code to explain it better:

                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 is the method that extracts the rss info.
InitHome is the method that changes the UI.


Thank you very much!

InitHome

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

Upvotes: 0

Views: 805

Answers (1)

Squonk
Squonk

Reputation: 48871

onProgressUpdate(...) runs on the UI thread so it shouldn't do a lot of time-consuming work - that defeats the use of AsyncTask in the first place.

Ideally onProgressUpdate(...) should simply provide basic progress updates such as percent complete or perhaps simple text messages indicating progression.

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

Upvotes: 1

Related Questions