Viewpage的.setCurrentItem 导致UI线程的执行阻塞问题 广告轮播 数据加载后填充viewpagerAdapter
来源:互联网 发布:一叶落而知秋为什么余 编辑:程序博客网 时间:2024/06/06 05:05
问题:
出现exception:Only the original thread that created a view hierarchy can touch its views.
执行U阻塞I的问题,现在想实现一个Viewpager自动轮播功能,并且是先去服务器端取得数据后再onPostExecute(String result)
但是图片轮播的指示器的小圆点导致了一点加载问题。导致问题出现的地方是:
<span style="white-space:pre"></span>int maxIndex = Integer.MAX_VALUE / 2; if (radioButtonID != null) viewPager.setCurrentItem(maxIndex - (maxIndex % radioButtonID.length));//默认在中间,使用户看不到边界 else viewPager.setCurrentItem(maxIndex);//默认在中间,使用户看不到边界
这一块不能再AsyncTask 的onPostExecute(String result) 方法中执行,必须执行在Activity的onCreate方法中
解决方法:
<span style="white-space:pre"></span>@Overrideprotected void onCreate(Bundle arg0) {super.onCreate(arg0);setContentView(R.layout.correcting_shopsgoods_detail);String per_data = null;String fdProdId,fdProdShortId;<span style="color:#ff6666;">initSlideViewPager();</span>isFirstCome = false;if (httpResult == null) { per_data = getIntent().getExtras().getString("per_data"); if (per_data == null) return; try {fdProdId = new JSONObject(per_data).getString("fdProdId");fdProdShortId = new JSONObject(per_data).getString("fdProdShortId");} catch (JSONException e) {return;} String uris[] = new String[]{ Properties.SERVER_URL_TEST + "/api.ashx?method=Product.Detail&id=" + fdProdId + "&data=null&", Properties.SERVER_URL_TEST + "/api.ashx?method=Store.Detail&id=" + fdProdShortId + "&data=null&"/*, Properties.SERVER_URL_TEST + "/api.ashx?method=Store.Detail&id=" + fdProdShortId*/ }; String keys[] = new String[] { "Product.Detail", "Store.Detail1"/*, "Store.Detail2"*/ }; mTaskList = new ArrayList<LoadDataAsyncTask>(); for (int i=0 ; i<keys.length ;i++) { LoadDataAsyncTask task = new LoadDataAsyncTask(uris[i],keys[i]);mTaskList.add(task); task.executeOnExecutor(FULL_TASK_EXECUTOR);}}}
<span style="white-space:pre"></span>/** * 这个模块不在oncreat方法中执行,会导致阻塞线程 * */private void initSlideViewPager() {viewPager = (SlideViewPager) findViewById(R.id.slide_viewpager);int maxIndex = Integer.MAX_VALUE / 2; if (radioButtonID != null) viewPager.setCurrentItem(maxIndex - (maxIndex % radioButtonID.length));//默认在中间,使用户看不到边界 else viewPager.setCurrentItem(maxIndex);//默认在中间,使用户看不到边界}
Activity全部参考代码:
public class C_GoodsDetailActivity extends C_BaseActivity{public ImageHandler_GoodsDetail imgHandler = new ImageHandler_GoodsDetail(new WeakReference<C_GoodsDetailActivity>(this)); public SlideViewPager viewPager; private int[] radioButtonID = null; private RadioGroup mGroup; private ArrayList<ImageView> views = null; private ImageView[] imgsViews = null; private RadioButton[] radioButtons = null; LinearLayout skuContainer,productImgsContainer; private Context context = this; private String imgsUrl[] = null; private String imgsHref[] = null; private int advertiseId[] = null; private static int SLIDE_IMGS_NUM = 0; private TextView askPrice; private ImageAdapter viewPageAdapter; private boolean isFirstCome ; public static final int INIT_EVENTS = 10116; private String httpResult = null; /** 异步多线程加载处理 */ private static int ID = 0; private static final int TASK_COUNT = 9; private static ExecutorService SINGLE_TASK_EXECUTOR; private static ExecutorService LIMITED_TASK_EXECUTOR; private static ExecutorService FULL_TASK_EXECUTOR; List<LoadDataAsyncTask> mTaskList; static { SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor(); LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(7); FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool(); }; @Overrideprotected void onCreate(Bundle arg0) {super.onCreate(arg0);setContentView(R.layout.correcting_shopsgoods_detail);String per_data = null;String fdProdId,fdProdShortId;initSlideViewPager();isFirstCome = false;if (httpResult == null) { per_data = getIntent().getExtras().getString("per_data"); if (per_data == null) return; try {fdProdId = new JSONObject(per_data).getString("fdProdId");fdProdShortId = new JSONObject(per_data).getString("fdProdShortId");} catch (JSONException e) {return;} String uris[] = new String[]{ Properties.SERVER_URL_TEST + "/api.ashx?method=Product.Detail&id=" + fdProdId + "&data=null&", Properties.SERVER_URL_TEST + "/api.ashx?method=Store.Detail&id=" + fdProdShortId + "&data=null&"/*, Properties.SERVER_URL_TEST + "/api.ashx?method=Store.Detail&id=" + fdProdShortId*/ }; String keys[] = new String[] { "Product.Detail", "Store.Detail1"/*, "Store.Detail2"*/ }; mTaskList = new ArrayList<LoadDataAsyncTask>(); for (int i=0 ; i<keys.length ;i++) { LoadDataAsyncTask task = new LoadDataAsyncTask(uris[i],keys[i]);mTaskList.add(task); task.executeOnExecutor(FULL_TASK_EXECUTOR);}}}@Overrideprotected void onResume() {super.onResume();if (httpResult != null) {if (isFirstCome) {showViewHandler.sendEmptyMessageDelayed(10115, 500);imgHandler.sendEmptyMessageDelayed(ImageHandler_Home.MSG_BREAK_SILENT, 300);isFirstCome = false;}isFirstCome = true;}}Handler showViewHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {if ( msg.what == 10115) {viewPager.setVisibility(View.VISIBLE);findViewById(R.id.topbanner).setVisibility(View.VISIBLE);viewPager.setBackgroundColor(Color.parseColor("#ffffff"));} else if ( msg.what == INIT_EVENTS) {initEvent();}return false;}});/** * 这个模块不在oncreat方法中执行,会导致阻塞线程 * */private void initSlideViewPager() {viewPager = (SlideViewPager) findViewById(R.id.slide_viewpager);int maxIndex = Integer.MAX_VALUE / 2; if (radioButtonID != null) viewPager.setCurrentItem(maxIndex - (maxIndex % radioButtonID.length));//默认在中间,使用户看不到边界 else viewPager.setCurrentItem(maxIndex);//默认在中间,使用户看不到边界}private void initViewsSlideView(String result) { LayoutInflater inflater = LayoutInflater.from(this); views = new ArrayList<ImageView>(); /*obj --> propImages --> "Key":"928", "propTargetUrl":"http://115.29.238.140:8017/cs/images/169/target", "propOriginalUrl":"http://115.29.238.140:8017/cs/images/169", "fdPrimUrl":"http://115.29.238.140:8017/cs/images/169", "fdAutoId":1*/ JSONArray jArrList = null; String imgs[] = null; String imgsOriginData[] = null; try { JSONObject obj = new JSONObject(new JSONObject(result).getString("obj"));String list = obj.getString("propImages");jArrList = new JSONArray(list);if(jArrList == null || jArrList!=null && jArrList.length() == 0) return;TextView productTitle = (TextView) findViewById(R.id.product_title);askPrice = (TextView) findViewById(R.id.ask_price); TextView goodsPrice = (TextView) findViewById(R.id.goods_price);goodsPrice.setText(obj.getString("fdProdPrice"));productTitle.setText(obj.getString("fdProdName"));askPrice.setOnClickListener(this);String uType ;if (getSharedPreferences(Properties.LOGIN_INFO, 0).getString("o2OSetSession", null) != null) {uType = this.getSharedPreferences(Properties.LOGIN_INFO, 0).getString(Properties.LoginInfo.USER_TYPE, null);if (uType != null && uType.equals("Buyer")) {askPrice.setVisibility(View.VISIBLE);} else {askPrice.setVisibility(View.GONE);}} else {askPrice.setVisibility(View.GONE);} imgsViews = new ImageView[jArrList.length()];imgs = new String[jArrList.length()]; imgsOriginData = new String[jArrList.length()]; radioButtons = new RadioButton[jArrList.length()]; radioButtonID = new int[jArrList.length()]; mGroup = (RadioGroup) findViewById(R.id.radioGroup1);for (int i = 0 ;i < jArrList.length(); i++) {imgsOriginData[i] = jArrList.get(i).toString();//700x700 尺寸 imgs[i] = new JSONObject(jArrList.get(i).toString()).getString("fdPrimUrl"); imgsViews[i] = (ImageView) inflater.inflate(R.layout.correcting_pgg_home_slide_item, null); BitmapManage.getInstance(context).get(imgs[i],imgsViews[i]); radioButtons[i] = (RadioButton) inflater.inflate(R.layout.correcting_pgg_home_slide_item_radiobutton, null); radioButtons[i].setId(0Xbbb+i); radioButtonID[i] = 0Xbbb+i; radioButtons[i].setPadding(5, 0, 0, 0); mGroup.addView(radioButtons[i]); views.add(imgsViews[i]); }} catch (Exception e) {return;} viewPageAdapter = new ImageAdapter(views); viewPager.setAdapter(viewPageAdapter);}private void initViewEnterShop(String result) {//obj --> fdShopLogo fdShopNameif (result != null) {try {JSONObject json = new JSONObject(new JSONObject(result).getString("obj"));String fdShopLogo = json.getString("fdShopLogo");String fdShopName = json.getString("fdShopName");ImageView icon = (ImageView) findViewById(R.id.icon);TextView shopName = (TextView) findViewById(R.id.shop_name);BitmapManage.getInstance(context).get(fdShopLogo, icon);shopName.setText(fdShopName);} catch (Exception e) {return;}} } private void initViewBottomView(String result) {if (result != null) {try {JSONObject obj = new JSONObject(new JSONObject(result).getString("obj"));JSONArray propStoreSKU = new JSONArray(obj.getString("propSKUs"));JSONArray propProperties = new JSONArray(obj.getString("propProperties"));skuContainer = (LinearLayout) findViewById(R.id.sku_container);LayoutInflater inflater = LayoutInflater.from(context);/*<p><b>商铺名称:</b><%= obj.propShopName %></p> <p><b>商品名称:</b><%= obj.fdProdName %></p> <p><b>商品分类:</b><%= obj.propClassifyName %></p> <p><b>商品类别:</b><%= obj.propCategory || "未分类" %></p> <p><b>最小起订量:</b><%= obj.propStartTip %></p> <p><b>产地:</b><%= obj.fdProdOrigin %></p> <p><b>商品编码:</b><%= obj.fdProdNum %></p>*/ //固定属性 String skuFixsKeys[] = new String[]{ "商铺名称:", "商品名称:", "商品分类:", "商品类别:", "最小起订量:", "产地:", "商品编码:" }; String skuFixsValues[] = new String[]{ obj.getString("propShopName"), obj.getString("fdProdName"), obj.getString("propClassifyName"), (StringUtil.isEmpty(obj.getString("propCategory")) || obj.getString("propCategory").trim().equals("null"))? "未分类" :obj.getString("propCategory"), obj.getString("propStartTip"), obj.getString("fdProdOrigin"), obj.getString("fdProdNum") }; for (int i=0;i<7;i++) { RelativeLayout skuRelativeLT = (RelativeLayout) inflater.inflate(R.layout.correcting_shopsgoods_detail_sku, null);TextView skuKeyTV = (TextView) skuRelativeLT.findViewById(R.id.goods_name);TextView skuValueTV = (TextView) skuRelativeLT.findViewById(R.id.sku_value);skuKeyTV.setText(skuFixsKeys[i]);skuValueTV.setText(skuFixsValues[i]);skuContainer.addView(skuRelativeLT); }for (int i=0;i<propStoreSKU.length();i++) {RelativeLayout skuRelativeLT = (RelativeLayout) inflater.inflate(R.layout.correcting_shopsgoods_detail_sku, null);TextView skuKeyTV = (TextView) skuRelativeLT.findViewById(R.id.goods_name);TextView skuValueTV = (TextView) skuRelativeLT.findViewById(R.id.sku_value);skuKeyTV.setText(propStoreSKU.getJSONObject(i).getString("Name") + ":");skuValueTV.setText(propStoreSKU.getJSONObject(i).getString("ValuesString"));skuContainer.addView(skuRelativeLT);}for (int i=0;i<propProperties.length();i++) {RelativeLayout skuRelativeLT = (RelativeLayout) inflater.inflate(R.layout.correcting_shopsgoods_detail_sku, null);TextView skuKeyTV = (TextView) skuRelativeLT.findViewById(R.id.goods_name);TextView skuValueTV = (TextView) skuRelativeLT.findViewById(R.id.sku_value);skuKeyTV.setText(propProperties.getJSONObject(i).getString("Name"));skuValueTV.setText(propProperties.getJSONObject(i).getString("Value"));skuContainer.addView(skuRelativeLT);}//<p><b>主要用途:</b><%= obj.fdProdUses %></p>RelativeLayout skuRelativeLT = (RelativeLayout) inflater.inflate(R.layout.correcting_shopsgoods_detail_sku, null);TextView skuKeyTV = (TextView) skuRelativeLT.findViewById(R.id.goods_name);TextView skuValueTV = (TextView) skuRelativeLT.findViewById(R.id.sku_value);skuKeyTV.setText("主要用途:");skuValueTV.setText(obj.getString("fdProdUses"));skuContainer.addView(skuRelativeLT);/*<%=# obj.fdProdSummary %> <%=# obj.fdProdIntroduce %>*/String fdProdSummary = obj.getString("fdProdSummary");String fdProdIntroduce = obj.getString("fdProdIntroduce");Pattern pattern = Pattern.compile("http://(.){1,170}jpg");Matcher matcherSummary = pattern.matcher(fdProdSummary);Matcher matcherIntroduce = pattern.matcher(fdProdIntroduce);productImgsContainer = (LinearLayout) findViewById(R.id.product_imgs_container);int i=0;if (!StringUtil.isEmpty(fdProdSummary) && matcherSummary.groupCount() != 0) {while(matcherSummary.find()) {OOMImageView imv = new OOMImageView(context);imv.setScaleType(ScaleType.FIT_XY); DisplayMetrics dm = new DisplayMetrics();((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);int W = dm.widthPixels;int H = 0;Integer w_h[] = BitmapManage.getInstance(context).get( matcherSummary.group(), imv);LinearLayout.LayoutParams llp;if (w_h!=null) {H = (int) ((w_h[1]*1.0)/(w_h[0]*1.0)*W)- 50;if (H == 0)llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);else llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,H);} else {llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);}llp.setMargins(25, 0, 25, 10);imv.setLayoutParams(llp);productImgsContainer.addView(imv);// W*H 947/473/*<ImageView android:layout_width="match_parent" android:layout_height="150dp" android:layout_marginBottom="70dp" android:layout_marginLeft="25dp" android:layout_marginRight="25dp" android:scaleType="fitXY" android:src="@drawable/logo_pgg_p" />*/}} if (!StringUtil.isEmpty(fdProdIntroduce) && matcherIntroduce.groupCount() != 0) {while(matcherIntroduce.find()) {OOMImageView imv = new OOMImageView(context);imv.setScaleType(ScaleType.FIT_XY); DisplayMetrics dm = new DisplayMetrics();((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);int W = dm.widthPixels;int H = 0;Integer w_h[] = BitmapManage.getInstance(context).get( matcherIntroduce.group(), imv);LinearLayout.LayoutParams llp;if (w_h!=null) {H = (int) ((w_h[1]*1.0)/(w_h[0]*1.0)*W) - 50;if (H == 0)llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);else llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,H);} else {llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);}llp.setMargins(25, 0, 25, 10);imv.setLayoutParams(llp);productImgsContainer.addView(imv);}}} catch (Exception e) {return;}} }private void initEvent() { viewPager.setOnPageChangeListener(new MypageChangeListener()); //开始轮播效果 imgHandler.sendEmptyMessageDelayed(ImageHandler_GoodsDetail.MSG_BREAK_SILENT, 50);}/** * 图片轮播监听 */private class MypageChangeListener implements OnPageChangeListener { @Override public void onPageSelected(final int arg0) { mGroup.check(radioButtonID[arg0 % radioButtonID.length ]); imgHandler.sendMessage(Message.obtain(imgHandler, ImageHandler_GoodsDetail.MSG_PAGE_CHANGED, arg0, 0)); imgsViews[arg0 % imgsViews.length].setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(C_GoodsDetailActivity.this, C_SpaceImageDetailActivity.class);//intent.putExtra("images", "");intent.putExtra("position", arg0 % imgsViews.length);//int[] location = new int[2];//imgsViews[arg0 % imgsViews.length].getLocationOnScreen(location);//intent.putExtra("locationX", location[0]);//intent.putExtra("locationY", location[1]);//intent.putExtra("width", imgsViews[arg0 % imgsViews.length].getWidth());//intent.putExtra("Sheight", imgsViews[arg0 % imgsViews.length].getHeight());imgHandler.sendEmptyMessage(ImageHandler_GoodsDetail.MSG_KEEP_SILENT);viewPager.setVisibility(View.GONE);findViewById(R.id.topbanner).setVisibility(View.GONE);viewPager.setBackgroundColor(0xf5f5f5);findViewById(R.id.container).setBackgroundColor(0x03ffffff);startActivity(intent);overridePendingTransition(0, 0);}}); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } //覆写该方法实现轮播效果的暂停和恢复 @Override public void onPageScrollStateChanged(int position) { switch (position) { case ViewPager.SCROLL_STATE_DRAGGING: imgHandler.sendEmptyMessage(ImageHandler_GoodsDetail.MSG_KEEP_SILENT); break; case ViewPager.SCROLL_STATE_IDLE: imgHandler.sendEmptyMessageDelayed(ImageHandler_GoodsDetail.MSG_UPDATE_IMAGE, ImageHandler_GoodsDetail.MSG_DELAY); break; default: break; } }}private class LoadDataAsyncTask extends AsyncTask<String, Void, String> {String uri,key;private LoadDataAsyncTask(String uri,String key){this.uri = uri;this.key = key;}@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);if (result != null) {//initViews();//initEvent();isFirstCome = false;try {if (this.key!=null && this.key.equals("Product.Detail")) {initViewsSlideView(result);initViewBottomView(result);showViewHandler.sendEmptyMessage(INIT_EVENTS);} else if (this.key!=null && this.key.equals("Store.Detail1")) {initViewEnterShop(result);} /*else if (this.key!=null && this.key.equals("Store.Detail2")) {}*/httpResult = result;} catch (Exception e) {return;}}}@Overrideprotected String doInBackground(String... params) {String userUUID = getSharedPreferences(Properties.LOGIN_INFO,0).getString(Properties.LoginInfo.USERUUID, "");String isRet = null;try {isRet = HttpManage.httpGet(context, this.uri, null);isRet = js.reLogin(null,this.uri, "get", null, new JSONObject(isRet));} catch (Exception e) {}return isRet;}}}
0 0
- Viewpage的.setCurrentItem 导致UI线程的执行阻塞问题 广告轮播 数据加载后填充viewpagerAdapter
- ViewPage+Volley实现动态加载网络图片广告轮播 !
- 线程加载数据后的ui线程刷新实现
- ViewPage的无线轮播
- viewpage轮播,小圆点的设置
- kdtable填充完数据后执行的方法
- 1.并发情况导致的线程阻塞和数据一致性问题
- 运用carousel的轮播广告后图标出不来
- 异步加载图片“阻塞”UI主线程问题的解决方案
- UI线程阻塞问题
- 关于UI线程的阻塞问题以及处理方式
- Bootstrap轮播的填充问题及其解决
- ViewPager禁止预加载以及ViewPagerAdapter的处理
- 轮播广告的实现
- 自定义ViewPage+底部指示器(广告图片轮播)
- Spinner填充数据后设置默认值的问题
- [Android]为Spinner填充数据后设置默认值的问题
- [Android]为Spinner填充数据后设置默认值的问题
- C#实现自己的Ctr+V
- poj2195(KM)
- 对于javascript中Null和Undefined类型的区分
- MYSQL事务避免脏读、不可重复读、幻读
- mysql 错误集锦
- Viewpage的.setCurrentItem 导致UI线程的执行阻塞问题 广告轮播 数据加载后填充viewpagerAdapter
- Problem1(Multiples of 3 and 5)
- C# datagridview 从excel导入数据后时间的显示
- 关于spring <mvc:resources> 标签的使用
- IOS开发证书显示“此证书的签发者无效”解决方法
- Glide加载图片原理----转载
- iOS-关闭应用时想让应用直接退出的方法
- java开发中的23种设计模式
- git first commit