Reputation: 2724
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
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