2012-04-07 112 views
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); 
    } 
+1

添加'InitHome'方法。 – Luksprog 2012-04-07 20:35:55

+0

好吧,它相當長。它是一種沉重的方法... 在代碼中添加... – 2012-04-07 20:39:02

+0

那麼,如果你說當你使用'publishProgress'並且該方法是「沉重的」時UI會凍結,你可能會想要發佈它。 – Luksprog 2012-04-07 20:40:52

回答

1

onProgressUpdate(...) UI線程因此它不應該做大量耗時的工作,上運行 - 這違背了擺在首位使用的AsyncTask的。

理想情況下,onProgressUpdate(...)應該簡單地提供基本的進度更新,例如完整百分比或可能表示進度的簡單文本消息。

所有用於顯示進展的視圖都應事先創建,但很多人使用onPreExecute()