无限适配器始终运行以在后台下载数据

时间:2012-06-13 20:09:34

标签: android commonsware-cwac

我已经在我的应用程序中自定义了EndlessAdapter的代码,但是我做了一个错误,因为这个无尽的适配器总是在后台下载数据而不是它应该在用户滚动列表后下载相同的内容而我无法找到相同的错误我们的项目。由于这个错误,我的应用程序有时会返回OutOfMemoryException,这是不可接受的。

请建议我解决同样的问题。

代码: * MyEndlessAdapter: *

 class DemoAdapterCat extends EndlessAdapter {
              private RotateAnimation rotate=null;
              ArrayList<String> tempListNamesCat = new ArrayList<String>();
              ArrayList<String> tempListImagesCat = new ArrayList<String>();
              ArrayList<String> tempListYearCat1 = new ArrayList<String>();
              ArrayList<String> tempListYearCat2 = new ArrayList<String>();
              ArrayList<String> tempListmpgCat1 = new ArrayList<String>();
              ArrayList<String> tempListmpgCat2 = new ArrayList<String>();
              ArrayList<String> tempListpriceCat1 = new ArrayList<String>();
              ArrayList<String> tempListpriceCat2 = new ArrayList<String>();
              ArrayList<String> tempListRatingCat1 = new ArrayList<String>();
              ArrayList<String> tempListRatingCat2 = new ArrayList<String>();

              DemoAdapterCat() {
               super(new CategoryListLazyAdapter(ResearchList.this, countriesSubCat, imagesSubCat, YearSubCat1,YearSubCat2, mpgSubCat1,mpgSubCat2, priceSubCat1,priceSubCat2, ratingSubCat1, ratingSubCat2));
               Utility util = new Utility();
                util.setListViewHeightBasedOnChildren(lvCategory);
               rotate=new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF,
                 0.5f, Animation.RELATIVE_TO_SELF,
                 0.5f);
               rotate.setDuration(600);
               rotate.setRepeatMode(Animation.RESTART);
               rotate.setRepeatCount(Animation.INFINITE);
              }
            /* 
              @Override
            public int getCount()
              {
                  //return brandList.getDisplayNames().size();
                  return countriesSubCat.size();
              }*/
              @Override
              protected View getPendingView(ViewGroup parent) {
               row=getLayoutInflater().inflate(R.layout.categorylist, null);

               child=row.findViewById(R.id.tv_CategoryItem_Name);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_MPG1);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_MPG2);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Price1);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Price2);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Rating1);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Rating2);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Year1);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.tv_CategoryItem_Year2);
               child.setVisibility(View.GONE);
               /*child = row.findViewById(R.id.img_CategoryItem);
               child.setVisibility(View.GONE);
               child = row.findViewById(R.id.img_CategoryItem_Arrow);
               child.setVisibility(View.GONE);*/

               /*child = row.findViewById(R.id.linear_main_MPG);
               child.setVisibility(View.GONE);*/
               child=row.findViewById(R.id.throbber);
               child.setVisibility(View.VISIBLE);
               child.startAnimation(rotate);

               return(row);
              }

              @Override
              protected boolean cacheInBackground() {

                    SystemClock.sleep(10000); 
               tempListNamesCat.clear();
               tempListImagesCat.clear();
               tempListmpgCat1.clear();
               tempListmpgCat2.clear();
               tempListpriceCat1.clear();
               tempListpriceCat2.clear();
               tempListYearCat1.clear();
               tempListYearCat2.clear();
               tempListRatingCat1.clear();
               tempListRatingCat2.clear();
               int lastOffset = getLastOffset();
               if(lastOffset < LIST_SIZE){
                int limit = lastOffset + BATCH_SIZE;
                for(int i=(lastOffset+1); (i<=limit && i<LIST_SIZE); i++){
                 tempListNamesCat.add(coll.getDisplayNames().get(i));
                 tempListImagesCat.add(coll.getImages().get(i));
                 tempListmpgCat1.add(coll.getMpg().get(i));
                 tempListmpgCat2.add(coll.getMpg().get(i+1));
                 tempListpriceCat1.add(coll.getPrice().get(i));
                 tempListpriceCat2.add(coll.getPrice().get(i+1));
                 tempListRatingCat1.add(coll.getRating().get(i));
                 tempListRatingCat2.add(coll.getRating().get(i+1));
                 tempListYearCat1.add(coll.getYears().get(i));
                 tempListYearCat2.add(coll.getYears().get(i+1));
                }    
                setLastOffset(limit);

                if(limit<LIST_SIZE){
                 //return true;
                    return(getWrappedAdapter().getCount()<coll.getDisplayNames().size());
                } else {
                 return false;
                }
               } else  {
                return false;
               }
              }


              @Override
              protected void appendCachedData() {

               @SuppressWarnings("unchecked")
               //Activity activity = this;
               //ArrayAdapter<String> arrAdapterNew = (ArrayAdapter<String>)getWrappedAdapter();
             CategoryListLazyAdapter arrAdapterNewCategory = (CategoryListLazyAdapter)getWrappedAdapter();
               //int listLen = tempList.size();
              // int listLen = tempListNames.size();
              countriesSubCat.addAll(tempListNamesCat);
              imagesSubCat.addAll(tempListImagesCat);
              mpgSubCat1.addAll(tempListmpgCat1);
              mpgSubCat2.addAll(tempListmpgCat2);
              priceSubCat1.addAll(tempListpriceCat1);
              priceSubCat2.addAll(tempListpriceCat2);
              ratingSubCat1.addAll(tempListRatingCat1);
              ratingSubCat2.addAll(tempListRatingCat2);
              YearSubCat1.addAll(tempListYearCat1);
              YearSubCat2.addAll(tempListYearCat2);
              arrAdapterNewCategory.notifyDataSetChanged();
              Utility util = new Utility();
              util.setListViewHeightBasedOnChildren(lvCategory);
              /* for(int i=0; i<listLen; i++){
              //  arrAdapterNew.add(tempList.get(i));
               }*/
              }
             }

将Demoadapter设置为列表:

public void setValuesInCategoryChildSortByAZ(String url,final String filter, final String from, final String to)
    {
        if(isOnline())
        {
            final ProgressDialog dialog = ProgressDialog.show(
                    ResearchList.this, "Research List       ",
                    "Please wait...   ", true);

            final Handler handler = new Handler() {

                public void handleMessage(Message msg) {

                    // System.out.println("The id after Save:"+id.get(0).toString());

                    // catagory.addAll(keyword_vector1);
                    linear_Category_Child.setVisibility(View.GONE);
                    linear_Category_Child_Child.setVisibility(View.VISIBLE);
                    //tv_Child_Header.setText("Volvo");
                    /*adapter = new CategoryListLazyAdapter(
                            ResearchList.this);
                    lvCategory.setAdapter(adapter);*/
                    demoAdapterCat.notifyDataSetChanged();
                    Utility util = new Utility();
                    util.setListViewHeightBasedOnChildren(lvCategory);
                    dialog.dismiss();
                }
            };

            final Thread checkUpdate = new Thread() {

                public void run() {
                    try {
                        String sortEncode = URLEncoder.encode("alpha");
                        String filterEncode = URLEncoder.encode(filter);
                        String clientEncode = URLEncoder.encode("10030812");
                        String fromEncode = URLEncoder.encode(from);
                        String toEncode = URLEncoder.encode(to);
                        String catUrl = "/v1/vehicles/get-make-models.json?sort="+sortEncode+"&filter="+filterEncode+"&client-id="+clientEncode+"&from="+fromEncode;
                        genSig = new GetSignature(catUrl, "acura");
                        try {
                            signature = genSig.getUrlFromString();
                        } catch (InvalidKeyException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        } catch (NoSuchAlgorithmException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        // jsonString =
                        // getJsonSring("http://api.highgearmedia.com/v1/vehicles/get-models.json?make=acura&client-id=10030812&signature=LWQbdAlJVxlXZ1VO2mfqAA==");
                        //String signatureEncode = URLEncoder.encode(signature);
                        String urlEncode = URLEncoder.encode(catUrl+"&signature="+signature);
                        jsonString = getJsonSring("http://apibeta.highgearmedia.com"+catUrl+"&signature="+signature);
                        System.out.println("The json category:===>"+jsonString);
                    } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (URISyntaxException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    JsonParse json = new JsonParse(jsonString);
                    json.parseCat();
                    handler.sendEmptyMessage(0);

                }

            };
            checkUpdate.start();
        }else
        {
            AlertDialog.Builder builder = new Builder(ResearchList.this);
            builder.setTitle("Attention!");
            builder.setMessage("Network Connection unavailable.");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {


                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub

                }
            });


            builder.create().show();
        }

    }

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

我无法在项目中找到同样的错误

EndlessAdapter示例应用程序位于:https://github.com/commonsguy/cwac-endless/tree/master/demo

如果您查看该示例应用程序,您会注意到它不会分叉任何线程。

如果您阅读the EndlessAdapter documentation,您会看到:

  

您的EndlessAdapter子类还需要实现cacheInBackground()。此方法将从后台线程调用,并且需要下载更多数据,这些数据最终将添加到您在构造函数中使用的ListAdapter中。虽然演示应用程序只是休眠10秒钟,但真正的应用程序可能会进行Web服务调用或以其他方式加载更多数据。

     

由于此方法是在后台线程上调用的,因此您不需要分叉自己的线程。但是,同时不要尝试直接更新UI。

因此,将项目更改为不分叉自己的线程,而是在cacheInBackground()中完成工作以检索并添加下一批数据。

如果该方法不符合您的应用运行方式,那很好,但您可能难以使用EndlessAdapter