0
我有一個很多rss信息的AsyncTask,然後將它應用到UI。 我有一個加載過程的指示器,並且它在後臺加載信息時UI運行平穩,但是當我調用PublishProgress()以便我可以編輯UI時,指示器凍結。 下面是一些代碼,以便更好地解釋:AsyncTask凍結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的方法。
非常感謝!
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);
}
添加'InitHome'方法。 – Luksprog 2012-04-07 20:35:55
好吧,它相當長。它是一種沉重的方法... 在代碼中添加... – 2012-04-07 20:39:02
那麼,如果你說當你使用'publishProgress'並且該方法是「沉重的」時UI會凍結,你可能會想要發佈它。 – Luksprog 2012-04-07 20:40:52