2010-10-18 35 views
2

Hai Friends, 我已經實現了選項卡監聽器,當我點擊它在列表視圖中加載數據的選項卡時沒有問題,如果我單擊其他選項卡選項,它也會加載正常,如果再單擊第一個我在日誌中得到以下異常,我不知道爲什麼我得到這個?,所以請幫助我。在Tab中需要幫助已更改監聽器?

error android.view.ViewRoot$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views. 

該代碼是

tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 

     @Override 
     public void onTabChanged(String arg0) { 

     if (arg0.equals("tab1")) { 
     Log.v("Hi","Tilsan"); 
     BS_Main.submit.setVisibility(View.INVISIBLE); 
     alt_header_text.setVisibility(View.INVISIBLE); 
     header_text.setText("Articles"); 
     tabHost.setCurrentTab(1); 
     if (temp_stat.equals("lv")) { 
      Log.v("Hi+++","Tilsan"); 

      alt_header_text.setVisibility(View.INVISIBLE); 
      back.setVisibility(View.INVISIBLE); 
      //share.setVisibility(View.INVISIBLE); 
      gal_lay.setVisibility(View.VISIBLE); 
      //lv_movies.setVisibility(View.GONE); 
      lv_movies.setVisibility(View.VISIBLE); 
      url = "http://www.theblacksheeponline.com/mobile/article.php?start=1&showcount=-1&tag=all"; 
      flyurl = url; 
      san_flag=true; 
      new San_FirstTask().execute(); 


     } 

     } else if (arg0.equals("tab2")) { 
     BS_Main.submit.setVisibility(View.INVISIBLE); 

     // visiblity(); 
     header_text.setText("Schools"); 
     alt_header_text.setVisibility(View.INVISIBLE); 
     if (BS_Bars.temp_bars == 0) { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv_bardate.setVisibility(View.GONE); 
      BS_Bars.lv_barlist.setVisibility(View.GONE); 
      // BS_Bars.lv_barlist_details.setVisibility(View.GONE); 
      BS_Bars.lv.setVisibility(View.VISIBLE); 
      back.setVisibility(View.INVISIBLE); 
      gal_lay.setVisibility(View.GONE); 
     } else if (BS_Bars.temp_bars == 1) { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv.setVisibility(View.GONE); 
      BS_Bars.lv_barlist.setVisibility(View.GONE); 
      // BS_Bars.lv_barlist_details.setVisibility(View.GONE); 
      BS_Bars.lv_bardate.setVisibility(View.VISIBLE); 
      back.setVisibility(View.VISIBLE); 
      gal_lay.setVisibility(View.GONE); 

     } else if (BS_Bars.temp_bars == 2) { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv_bardate.setVisibility(View.GONE); 
      BS_Bars.lv.setVisibility(View.GONE); 
      BS_Bars.lv_barlist.setVisibility(View.VISIBLE); 
      back.setVisibility(View.VISIBLE); 
      gal_lay.setVisibility(View.GONE); 

     } else if (BS_Bars.temp_bars == 3) { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv_bardate.setVisibility(View.GONE); 
      BS_Bars.lv.setVisibility(View.GONE); 
      BS_Bars.lv_barlist.setVisibility(View.GONE); 
      back.setVisibility(View.VISIBLE); 
      gal_lay.setVisibility(View.GONE); 

     } else if (BS_Bars.temp_bars == 4) { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv_bardate.setVisibility(View.GONE); 
      BS_Bars.lv.setVisibility(View.GONE); 
      BS_Bars.lv_barlist.setVisibility(View.GONE); 
      BS_Bars.bars_wv.setVisibility(View.VISIBLE); 
      back.setVisibility(View.VISIBLE); 
      gal_lay.setVisibility(View.GONE); 

     } else { 
      BS_Main.submit.setVisibility(View.INVISIBLE); 

      BS_Bars.lv.setVisibility(View.VISIBLE); 
      BS_Bars.lv_barlist.setVisibility(View.GONE); 
      BS_Bars.lv_bardate.setVisibility(View.GONE); 
      back.setVisibility(View.GONE); 
      gal_lay.setVisibility(View.GONE); 
     } 

     } else if (arg0.equals("tab3")) { 
     back.setVisibility(View.GONE); 
     gal_lay.setVisibility(View.GONE); 
     alt_header_text.setVisibility(View.INVISIBLE); 
     header_text.setText("ShoutOuts"); 
     BS_Main.submit.setVisibility(View.INVISIBLE); 
     tabHost.setCurrentTab(3); 
     BS_Shoutout.shout_realtive.setVisibility(View.VISIBLE); 
     } else if (arg0.equals("tab4")) { 
     Log.v("Tag", "TAB4"); 
     back.setVisibility(View.GONE); 
     //share.setVisibility(View.GONE); 
     gal_lay.setVisibility(View.GONE); 
     temp_stat1 = "imgv"; 
     header_text.setText("Pictures"); 
     alt_header_text.setVisibility(View.INVISIBLE); 
     Log.v("TAG", "Pictures"); 
     tabHost.setCurrentTab(4); 
     } else if (arg0.equals("tab5")) { 
     Intent obj_intent = new Intent(BS_Main.this, 
      Rss_Feed_Grid.class); 
     startActivity(obj_intent); 
     } 
     } 
     }); 

// Asynchronous Task class code 

private class San_FirstTask extends AsyncTask<Void, Void, Void> { 
    private final ProgressDialog dialog = new ProgressDialog(BS_Main.this); 
    String san_url; 
    // can use UI thread here 
    protected void onPreExecute() { 
    this.dialog.setMessage("Loading..."); 
    this.dialog.setCancelable(false); 
    this.dialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
    try { 
    if(san_flag == true) 
    { 
    Log.v("Hai Sankar","san_flag==true"); 
    san_url="http://www.theblacksheeponline.com/mobile/article.php?start=1&showcount=-1&tag="+san_id[0]; 
    Log.v("SanUrl_here", san_url); 
    slist = new MultiLine_Sex(BS_Main.this, san_url); 
    lv_movies.addFooterView(footerView, null, true); 
    footerView.setVisibility(View.VISIBLE); 
    san_flag=false; 
    } 
    else 
    { 
    Log.v("Url_here", url); 
    slist = new MultiLine_Sex(BS_Main.this, url); 
    } 

    Log.v(TAG, "progress"); 
    } catch (Exception e) { 
    Log.v(TAG, "error " + e); 
    } 
    return null; 
    } 

    protected void onPostExecute(Void result) { 

    Log.v("Hai","Inside Else in Atask"); 
// footerView.setVisibility(View.VISIBLE); 
// ListView.FixedViewInfo footerInfo1 = lv_movies.new FixedViewInfo(); 
// footerInfo1.isSelectable=true; 
// ArrayList<ListView.FixedViewInfo> footerInfos1=new ArrayList<ListView.FixedViewInfo>(); 
// footerInfo1.view = footerView; 
// footerInfos1.add(footerInfo1); 
// HeaderViewListAdapter headerViewListAdapter1 = new HeaderViewListAdapter(null,footerInfos1,slist); 
// lv_movies.setAdapter(headerViewListAdapter1); 
    //lv_movies.addFooterView(footerView); 
    //footerView.setVisibility(View.VISIBLE); 
    lv_movies.setAdapter(slist); 
    slist.notifyDataSetChanged(); 

// code blocked by sandher....... 
// if (san_url != null) { 
// Log.v("Hai","Inside If in Atask"); 
// footerView.setVisibility(View.VISIBLE); 
// ListView.FixedViewInfo footerInfo = lv_movies.new FixedViewInfo(); 
// footerInfo.isSelectable=false; 
// ArrayList<ListView.FixedViewInfo> footerInfos=new ArrayList<ListView.FixedViewInfo>(); 
// footerInfo.view = footerView; 
// footerInfos.add(footerInfo); 
// HeaderViewListAdapter headerViewListAdapter = new HeaderViewListAdapter(null,footerInfos,slist); 
// lv_movies.setAdapter(headerViewListAdapter); 
// //lv_movies.addFooterView(footerView); 
////  
//// lv_movies.addFooterView(footerView); 
//// lv_movies.setAdapter(slist); 
// slist.notifyDataSetChanged(); 
// } 
// else if (url != null) { 
// Log.v("Hai","Inside Else in Atask"); 
// footerView.setVisibility(View.VISIBLE); 
// ListView.FixedViewInfo footerInfo1 = lv_movies.new FixedViewInfo(); 
// footerInfo1.isSelectable=true; 
// ArrayList<ListView.FixedViewInfo> footerInfos1=new ArrayList<ListView.FixedViewInfo>(); 
// footerInfo1.view = footerView; 
// footerInfos1.add(footerInfo1); 
// HeaderViewListAdapter headerViewListAdapter1 = new HeaderViewListAdapter(null,footerInfos1,slist); 
// lv_movies.setAdapter(headerViewListAdapter1); 
// 
// //lv_movies.addFooterView(footerView); 
// //lv_movies.setAdapter(slist); 
// slist.notifyDataSetChanged(); 
// } 
    if (this.dialog.isShowing()) { 
    this.dialog.dismiss(); 
    } 
    } 
} 

回答

3

您正在啓動一個異步線程(經由AsyncTask)被點擊第一個選項卡時。在doInBackground()(這是在異步線程運行的部分),你可以調用兩個方法,其修改UI

lv_movies.addFooterView(footerView, null, true); 
footerView.setVisibility(View.VISIBLE); 

漂亮顯然是其中一個導致錯誤。 全部 UI操作應該在UI線程上運行。如果您無法重新排列代碼以在onPreExecute()onPostExecute()上執行這些操作,請將其打包到Activity.runOnUIThread()View.post()的調用中。


在這種情況下的簡單的解決方法是將上述兩行更改爲

footerView.post(new Runnable() { 
    run() { 
    lv_movies.addFooterView(footerView, null, true); 
    footerView.setVisibility(View.VISIBLE); 
    } 
}); 

這將使可運行到「消息隊列」,這將導致其被在UI上運行只要該線程完成處理所有以前的事件,就立即開始線程。 (UI線程只是一個循環,它不斷查找要添加到消息隊列中的新事件,並按收到的順序執行它們。)

+0

@ Mr.Beekeeper:感謝您的幫助,朋友,您可以解釋一下如何要使用Activity.runOnUIThread()或View.post(),所以給我看一個鏈接,其中包含了一個示例。 – 2010-10-18 15:18:37

+0

回答更新了一個例子。 – beekeeper 2010-10-18 15:56:46