2014-10-16 97 views
-1

我创建了一个应用程序,它使用视图pager显示一个pdf文件。每个pdf文件只包含一个page.I试图加载20个pdf文件使用视图pager.But当我通过pdf文件它给我的内存错误。如何处理查看页面中的内存管理

10-16 14:48:18.410: E/Inside onCreateView(12317): 1.pdf 
10-16 14:48:24.030: E/dalvikvm-heap(12317): Out of memory on a 2961936-byte allocation. 
10-16 14:48:24.040: E/AndroidRuntime(12317): FATAL EXCEPTION: main 
10-16 14:48:24.040: E/AndroidRuntime(12317): java.lang.OutOfMemoryError 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.graphics.Bitmap.nativeCreate(Native Method) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.graphics.Bitmap.createBitmap(Bitmap.java:585) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at com.epapyrus.plugpdf.core.viewer.PageView.adjustPatch(PageView.java:352) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at com.epapyrus.plugpdf.core.viewer.SinglePageDisplay.onUserInteractionComplete(SinglePageDisplay.java:107) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at com.epapyrus.plugpdf.core.viewer.SinglePageDisplay$2.run(SinglePageDisplay.java:219) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.os.Handler.handleCallback(Handler.java:605) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.os.Handler.dispatchMessage(Handler.java:92) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.os.Looper.loop(Looper.java:137) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at android.app.ActivityThread.main(ActivityThread.java:4507) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at java.lang.reflect.Method.invokeNative(Native Method) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at java.lang.reflect.Method.invoke(Method.java:511) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 
10-16 14:48:24.040: E/AndroidRuntime(12317): at dalvik.system.NativeStart.main(Native Method) 

下面是我pageviewer类

package com.android.pageviewers; 

import java.util.ArrayList; 
import java.util.List; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class PageViewActivity extends FragmentActivity implements Communicator{ 
    MyPageAdapter pageAdapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_page_view); 

     // viewPdf(); 

     List<Fragment> fragments = getFragments();   
     pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);   
     ViewPager pager = (ViewPager)findViewById(R.id.pager); 
     // ViewPager pager = new ViewPager(this); 
     // pager.setId(R.id.pager); 
     pager.setAdapter(pageAdapter); 

    } 

    /* 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View contentView = inflater.inflate(R.layout.activity_page_view, container, false); 
     List<Fragment> fragments = getFragments(); 
     pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);   
     ViewPager pager = (ViewPager)contentView.findViewById(R.id.pager); 
     pager.setAdapter(pageAdapter); 
     return contentView; 
    } 
    */ 

    private List<Fragment> getFragments(){ 

     List<Fragment> fList = new ArrayList<Fragment>();  
     fList.add(MyFragment2.newInstance("Fragment 1")); 
     fList.add(MyFragment2.newInstance("Fragment 2")); 
     fList.add(MyFragment2.newInstance("Fragment 3")); 

     return fList; 
    } 



    private class MyPageAdapter extends FragmentPagerAdapter { 
     private List<Fragment> fragments; 

     public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { 
      super(fm); 
      this.fragments = fragments; 
     } 
     @Override 
     public Fragment getItem(int position) { 
      return this.fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return this.fragments.size(); 
     } 
    } 

} 
以下

是fragment2类

package com.android.plugpdfsample; 

import java.io.File; 
import java.io.InputStream; 

import com.epapyrus.plugpdf.SimpleDocumentReader; 
import com.epapyrus.plugpdf.SimpleDocumentReaderListener; 
import com.epapyrus.plugpdf.SimpleReaderFactory; 
import com.epapyrus.plugpdf.core.viewer.DocumentState; 
import com.epapyrus.plugpdf.core.viewer.ReaderView; 

import android.content.Intent; 
import android.content.res.AssetManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class MyFragment extends Fragment { 
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 
    // create a listener for receiving provide pdf loading results 
       SimpleDocumentReaderListener m_listener = new SimpleDocumentReaderListener() { 

        @Override 
        public void onLoadFinish(DocumentState.OPEN state) { 
        } 
       }; 


    public static final MyFragment newInstance(String message) 
    { 
     MyFragment f = new MyFragment(); 
     Bundle bdl = new Bundle(1); 
     bdl.putString(EXTRA_MESSAGE, message); 
     f.setArguments(bdl); 
     return f; 
    } 

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

     Log.i("onCreateView1", "startView v = inflater.inflate(R.layout.myfragment_layout, container, false); 

     String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); 
     File fl =new File(Environment.getExternalStorageDirectory(), "/1.pdf"); 
     ReaderView readerView = (ReaderView) v.findViewById(R.id.pdfview); 
     readerView.openFile(fl.toString(),""); 

     Log.i("onCreateView1", "ends"); 

     return v; 
    } 

}

下面

为PDF文件的XML标签

<com.android.ab.custom.PDFView 
      android:id="@+id/pdfview" 
      android:background="#FF0000FF" 
      android:padding="5dp" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
+0

请发表相关的代码。 – Okas 2014-10-16 14:59:37

回答

1

只需关闭片段中onDestroyView()方法中的打开的pdf文件即可。

1

显然。随着更多的活动,碎片,图像,......更多的内存,你需要。而不是加载20 ViewPager尝试只加载3,然后像ListView一样回收它们。

我因为这个说3:

ViewPager 1 -> The previous loaded PDF 
ViewPager 2 -> Current and visible loaded PDF 
ViewPager 3 -> The next loaded PDF 

一旦用户不滚动,你需要重新加载只是这三ViewPager。

+0

如何回收页面? – 2014-10-16 15:09:08

+0

你应该给一些代码来帮助你:-) – Eric 2014-10-16 15:12:05

+0

代码添加到主post.i只是在这里复制3个片段。当我运行我试着与约20 – 2014-10-17 00:54:59