【问题标题】:How to improve the performance and customize the listview to avoid OMM error in Android如何提高性能并自定义listview以避免Android中的OMM错误
【发布时间】:2016-01-22 13:39:50
【问题描述】:

我是 Android 的绝对初学者,现在我开始使用带有 Listview 的 volley HTTP 库。所以我创建了一个测试项目并尝试了 volley 和 Android。我正在创建一个新提要查看应用程序。例如,facebook 新闻。数据只是用于学习目的的虚拟数据。我的项目按预期工作。当 scoll 到达列表视图的底部时,它会加载新数据。但是在频繁加载数据多次后,我的应用程序抛出内存不足错误。

我的活动课

public class VolleyActivity extends Activity{
    private int defaultLastLoadedItem=0;
    private int lastSawFirstListItem;
    private int itemLoadedOn;
    private ArrayAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.volley_main);

        Button getBtn = (Button)findViewById(R.id.btn_get_request);
        getBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        ListView listView = (ListView)findViewById(R.id.volleyListView);
        adapter = new CustomAdapter(this,new ArrayList<Entity>());
        listView.setAdapter(adapter);
        updateListView();
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if(lastSawFirstListItem<firstVisibleItem)
                {
                    int currentLastItem = firstVisibleItem+visibleItemCount;
                    if(currentLastItem!=itemLoadedOn)
                    {
                        updateListView();
                        Toast.makeText(getBaseContext(),"More item loaded",Toast.LENGTH_SHORT).show();
                        itemLoadedOn = currentLastItem;
                    }
                }
                lastSawFirstListItem = firstVisibleItem;
            }
        });
    }
    public void updatedListView(int lastloadedItem)
    {
        defaultLastLoadedItem = lastloadedItem;
        //"http://api.androidhive.info/feed/feed.json";
        String url = "http://192.168.43.82:8888/simple_json/index.json";//"http://api.androidhive.info/feed/feed.json";

        JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                List<Entity> items = new ArrayList<Entity>();
                try{
                    JSONArray jsonArray = jsonObject.getJSONArray("feed");
                    for(int i=0;i<jsonArray.length();i++)
                    {
                        JSONObject item = jsonArray.getJSONObject(i);
                        Entity en = new Entity();
                        en.setId(item.getInt("id"));
                        en.setName(item.getString("name"));
                        en.setUrl(item.getString("url"));
                        items.add(en);
                    }
                    adapter.addAll(items);

                }
                catch (JSONException e)
                {
                    Toast.makeText(getBaseContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(getBaseContext(),"Error listener",Toast.LENGTH_SHORT).show();
            }
        });

        Volley.newRequestQueue(getBaseContext()).add(jsonRequest);
    }
    public void updateListView()
    {
        updatedListView(defaultLastLoadedItem);
    }

}

我想知道的是:

  1. 我的应用程序在投入生产时会抛出这种错误(omm)吗?

  2. 如果可以,我该如何解决这个问题?

  3. 如果我当前的代码不合适,我应该如何为这种newfeeds 应用自定义listview 以获得更好的性能?

【问题讨论】:

    标签: android listview android-volley


    【解决方案1】:

    我认为您的 http 请求在您滚动时一直被调用

    您只需在 onScrollsetOnScrollListener 中添加以下代码

    final int lastItem = firstVisibleItem + visibleItemCount;
    if(lastItem == totalItemCount) {
        //your http request
    }
    

    我希望这对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多