2010-10-18 37 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