0

我在我的应用程序中自定义了 EndlessAdapter 的代码,但我犯了一个错误,因为这个 Endless Adapter 总是在后台下载数据,而不是在用户向下滚动列表后下载相同的数据,我无法在我们的项目中找到相同的错误。由于这个错误,我的应用程序有时会返回 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();
        }

    }

提前致谢。

4

1 回答 1

0

我在我们的项目中找不到同样的错误

EndlessAdapter 示例应用程序在这里:https ://github.com/commonsguy/cwac-endless/tree/master/demo 。

如果您查看该示例应用程序,您会注意到它没有派生任何线程。

如果您阅读文档,您EndlessAdapter看到:

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

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

所以,改变你的项目,不要分叉你自己的线程,而是做你的工作cacheInBackground()来检索和添加下一批数据。

如果该方法不适合您的应用程序需要运行的方式,那很好,但您可能在使用EndlessAdapter.

于 2012-06-13T21:17:34.920 回答