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
原创粉丝点击