android - 在选项卡更改监听器中需要帮助吗?

标签 android

各位 friend , 我已经实现了选项卡监听器,当我单击选项卡时,它会毫无问题地加载 ListView 中的数据,如果我单击其他选项卡选项,它也会加载正常,如果我再次单击第一个选项卡,我会收到以下异常在我的日志中,我不知道为什么会得到这个?所以请帮助我。

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();
   }
  }
 }

最佳答案

当单击第一个选项卡时,您将启动一个异步线程(通过 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);
  }
});

这会将 Runnable 放入“消息队列”中,一旦该线程完成处理所有先前的事件,它就会在 UI 线程上运行。 (UI线程只是一个循环,它不断地寻找要添加到消息队列中的新事件,并按照接收到的顺序执行它们。)

关于android - 在选项卡更改监听器中需要帮助吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3960444/

相关文章:

android - 为什么我在 Android 上的 XML 文件被截断为 1000 字节

java - 发送和接收短信以验证手机号码

android - 如果文本比 View 长,动态 TextView 不会选取框

android - 为什么我在 doInBackground 上出错

android - 无法通过 Debug/Release APK 版本查看 map

android - 在关闭应用程序的情况下使用 'react-native-camera'

android - 调用SurfaceHolder.setFixedSize()有什么用?

java - 检查 ArrayList<> 是否包含对象不起作用

android - Xamarin.Forms - ControlTemplate 不显示 ContentPresenter

android - uiautomatorviewer 不适用于最新的 MacOS