【问题标题】:listview does not work on fragment - OutOfMemoryError: Failed to allocatelistview 对片段不起作用 - OutOfMemoryError: Failed to allocate
【发布时间】:2017-06-27 17:35:08
【问题描述】:

ListView 不适用于片段,我尝试了一些代码,但它仍然继续说 - “应用程序已停止”

我的主要活动

public class OrtaMain extends Fragment {

    private ListView listView;
    private  int[] user_poster_resources={
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home
    };
    private int[] alt_resource={
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home,
            R.drawable.home
    };

    private String[] konu_basliks;
    private String[] konu_tarihs;
    private String[] konu_iceriks;
    OrtaMainAdapter adapter;

    public OrtaMain() { }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view       = inflater.inflate(R.layout.fragment_orta_main, container, false);
        listVie         = (ListView) view.findViewById(R.id.orta_main_liste);
        konu_basliks    = getResources().getStringArray(R.array.strin_baslik);
        konu_tarihs     = getResources().getStringArray(R.array.konu_tarih);
        konu_iceriks    = getResources().getStringArray(R.array.konu_icerik);

        int i = 0;
        adapter = new OrtaMainAdapter(getActivity(), R.layout.ortamain_item);
        listView.setAdapter(adapter);

        for (String basliklar:konu_basliks) {
            OrtaMainDataProvider dataProvider = new OrtaMainDataProvider(basliklar);
            adapter.add(dataProvider);
            i++;
        }
        return view; 
    }
}

数据提供者

public class OrtaMainDataProvider {
    private String baslik;

    public OrtaMainDataProvider(String baslik) {
        this.setBaslik(baslik);
    }

    public String getBaslik() {
        return baslik;
    }

    public void setBaslik(String baslik) {
        this.baslik = baslik;
    }
}

适配器类

public class OrtaMainAdapter extends ArrayAdapter {

    List list = new ArrayList();

    public OrtaMainAdapter(@NonNull Context context, @LayoutRes int resource) {
        super(context, resource);
    }

    @Override
    public void add(@Nullable Object object) {
        super.add(object);
        list.add(object);
    }

    static class DataHandler{
        TextView konu_baslik;
    }

    public int getCount(){
        return this.list.size();
    }

    @Nullable
    @Override
    public Object getItem(int position) {
        return this.list.get(position);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View row;
        row = convertView;
        DataHandler handler;

        if (convertView == null){
            LayoutInflater inflater =(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.ortamain_item, parent, false);
            handler = new DataHandler();
            handler.konu_baslik = (TextView) row.findViewById(R.id.orta_main_baslik);
            row.setTag(handler);
        }
        else{
            handler = (DataHandler) row.getTag();
        }

        OrtaMainDataProvider dataProvider;
        dataProvider= (OrtaMainDataProvider) this.getItem(position);
        handler.konu_baslik.setText(dataProvider.getBaslik());

        return row;
    }
}

logcat信息

06-27 14:31:37.836 11336-11336/com.example.cc.trafikprojesi E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.cc.trafikprojesi, PID: 11336
                                                                          java.lang.OutOfMemoryError: Failed to allocate a 80281612 byte allocation with 16777216 free bytes and 42MB until OOM
                                                                              at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                                                                              at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                                                                              at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
                                                                              at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
                                                                              at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973)
                                                                              at android.content.res.Resources.loadDrawableForCookie(Resources.java:2423)
                                                                              at android.content.res.Resources.loadDrawable(Resources.java:2330)
                                                                              at android.content.res.TypedArray.getDrawable(TypedArray.java:749)
                                                                              at android.widget.ImageView.<init>(ImageView.java:146)
                                                                              at android.widget.ImageView.<init>(ImageView.java:135)
                                                                              at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:60)
                                                                              at android.support.v7.widget.AppCompatImageView.<init>(AppCompatImageView.java:56)
                                                                              at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:106)
                                                                              at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1029)
                                                                              at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1087)

这些代码适用于任何简单的活动。当我测试别人时。但是当我输入这些代码时,列表视图不起作用并且模拟器正在停止..

此外,当我不放置 ListView 代码时,片段运行良好,并且片段给出错误并且在模拟器上不起作用。

ListView 不能处理片段吗?我必须只穿上非碎片吗?

【问题讨论】:

  • 片段中可能有 ListView,请提供您的 logcat 错误。
  • logcat 错误??你的意思是在 android studio 上记录事件?
  • MenuBar --&gt; Window --&gt; Show view --&gt; Other --&gt; logcat - 在这里您可以找到红色的异常。但是,是的,只需添加您遇到的任何异常。
  • 另外,请进一步澄清你的最后一段,因为它们没有意义,我试图为你解决它,但我不知道你想说什么,对不起。
  • 谢谢你兄弟..我现在找到了logcat..我发现了错误..让我把话题放在好起来..

标签: android memory-leaks


【解决方案1】:

这是我的建议,它应该会有所帮助......

您可以忽略不推荐的问题,并通过将其添加到您的 android 清单文件中来增加 heapSize:

&lt;application android:largeHeap="true"

同时设置Bitmap.Config 输入RGB_565 而不是ARGB_8888 以保持位图更小。

但这里最好的选择是花一些时间使用LeakCanary 分析您的应用程序,并观看此视频以了解 Android 的内存管理 - Google I/O 2011: Memory management for Android Apps(从4:12 播放以了解原因@987654330 @ 不好。)然后在 8:31 他们详细了解堆使用情况。

大堆修复是临时修复,不应被视为最终修复。我强烈推荐 profiling,看看Fragment life cycle,在 Fragment 完全完成之前调用的方法是 onDetach() 方法,你可能想在这里释放所有资源。片段本身被销毁和 gc'ed 的事实并不意味着您分配的所有资源都被删除。

【讨论】:

  • 非常欢迎您,我正在进一步更新答案,以便为您提供更多信息。 largeHeap=true 不应该被认为是一个修复。因为问题可能要大得多。如果您的应用程序正在泄漏内存,那么它可能会因大量使用而再次崩溃。明天再回来看看,答案会更可靠。祝你好运。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多