2013-03-28 20 views
10

Tôi đang bắt đầu một ứng dụng mới với minSdkVersion = "14" và targetSdkVersion = "17". Nó chứa một viewpager với 6 trang. Có 3 lượt xem web và 3 chế độ xem khác.Android - Tại sao ứng dụng của tôi sử dụng khoảng 40MB quy trình nền được lưu trong bộ nhớ cache?

Khi tôi đẩy ứng dụng của mình lên nền bằng cách nhấp vào nút quay lại hoặc nút trang chủ, nó sử dụng khoảng 40MB trong "quy trình nền được lưu trong bộ nhớ cache" và tôi không hiểu tại sao.

Đây là một ví dụ về một trong webview của tôi:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.RelativeLayout; 

public class Presentation extends Fragment { 
    boolean isOption = false; 
    RelativeLayout main = null; 
    WebView web_main = null; 

    public Presentation() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     main = (RelativeLayout) inflater.inflate(R.layout.webview, container, false); 
     return main; 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onActivityCreated(savedInstanceState); 
     web_main = new WebView(getActivity().getApplicationContext()); 
     web_main.setWebViewClient(new WebViewClient()); 
     web_main.getSettings().setAppCacheEnabled(false); 
     web_main.loadUrl("file:///android_asset/main.html"); 
     main.removeAllViews(); 
     main.addView(web_main); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i(getClass().getName(), "[OnDestroy]"); 
     main.removeAllViews(); 
     web_main.destroy(); 
     main = null; 
     web_main = null; 
     System.gc(); 
    } 

} 

Tôi đi theo nhiều hướng dẫn và câu trả lời nhưng không có ảnh hưởng đến quá trình nền cache Đây là hoạt động chính của tôi:

public class AppTest extends FragmentActivity { 

/** 
* The {@link android.support.v4.view.PagerAdapter} that will provide 
* fragments for each of the sections. We use a 
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which 
* will keep every loaded fragment in memory. If this becomes too memory 
* intensive, it may be best to switch to a 
* {@link android.support.v4.app.FragmentStatePagerAdapter}. 
*/ 
SectionsPagerAdapter mSectionsPagerAdapter; 

/** 
* The {@link ViewPager} that will host the section contents. 
*/ 
ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_content); 

    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the app. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(
      getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

} 

@Override 
protected void onStop() { 
    super.onStop(); 
    System.gc(); 
    Log.i(getClass().getName(), "[OnStop]"); 
    android.os.Debug.stopMethodTracing(); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main_content, menu); 
    return true; 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mViewPager.removeAllViews(); 
    Log.i(getClass().getName(), "[OnDestroy]"); 
} 

/** 
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
* one of the sections/tabs/pages. 
*/ 
public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     // Return a DummySectionFragment (defined as a static inner class 
     // below) with the page number as its lone argument. 
     Fragment fragment = null; 

     switch (position) { 
     case 0: 
      fragment = new Presentation(); 
      break; 
       /* case 1: 
      fragment = new Edition(); 
      break; 
     case 2: 
      fragment = new Programme(); 
      break; 
     case 3: 
      fragment = new Twitter(); 
      break; 
     case 4: 
      fragment = new Partenaire(); 
      break; 
     case 5: 
      fragment = new Information(); 
      break;*/ 
     default: 
      fragment = new Presentation(); 
      break; 
     } 


     return fragment; 
    } 

    @Override 
    public int getCount() { 
     // Show 6 total pages. 
     return 6; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position) { 
     case 0: 
      return "Presentation"; 
     case 1: 
      return "Edition"; 
     case 2: 
      return "Program"; 
     case 3: 
      return "Tweets"; 
     case 4: 
      return "Partners"; 
     case 5: 
      return "Information"; 
     } 
     return null; 
    } 
} 
} 

Bất cứ ai có thể nhìn thấy những gì là sai?

EDIT Tôi cố gắng để đưa webview trong cách bố trí nhưng nó vẫn như nhau Trong thực tế, tôi muốn biết những gì được đặt trong bộ nhớ cache khi ứng dụng ở trạng thái nền?

+1

Không có ý tưởng nếu nó có liên quan, nhưng trong mảnh trình bày của bạn, bạn có: onCreateView nhưng bên trong bạn gọi super.onCreate() vs super.onCreateView. Điều đó có vẻ hơi lạ với tôi. Đối với phần còn lại, không có ý tưởng atm – Entreco

+0

Tôi thay thế super.onCreate() bằng super.onCreateView() nhưng nó vẫn giống nhau – TraeX

Trả lời

5

"Quy trình nền được lưu trong bộ nhớ cache" thường đề cập đến các quá trình không có hoạt động tiền cảnh và không có dịch vụ đang chạy. Các quy trình này được lưu giữ trong bộ nhớ vì chúng tôi có đủ bộ nhớ và chúng tôi có thể cho phép người dùng chuyển lại cho họ một cách nhanh chóng. Nếu Android bắt đầu hết RAM, các quá trình này sẽ là những cái đầu tiên bị phá hủy để giải phóng RAM. Đôi khi, một quy trình ứng dụng cũ có thể được giữ lại khi cùng một ứng dụng được chuyển sang một quy trình mới.

Theo như tôi có thể nói, không gian bị chiếm đóng trong trạng thái "quy trình nền được lưu trong bộ nhớ cache" sẽ được xác định bởi bất kỳ ứng dụng nào của bạn hiện đang sử dụng. Ví dụ, nếu một ứng dụng đang sử dụng 20MB ở nền trước, sau đó nếu RAM có sẵn, cùng một lượng không gian sẽ bị chiếm đóng.

Nếu ứng dụng của bạn có 3 ImageViews và 3 WebViews, nó có thể chiếm 40MB dung lượng RAM tùy thuộc vào những gì được lưu trữ trong những ImageView và WebView đó. Bạn có thể sử dụng Profiling tools để xem dung lượng bộ nhớ mà ứng dụng của bạn đang sử dụng và thành phần của nó là gì. Nếu bộ nhớ được sử dụng trong nền trước tương tự như bộ nhớ khi ở trạng thái nền, thì mọi thứ sẽ như vậy.

Lưu ý: Các nhà sản xuất có thể gây rối với ứng dụng cài đặt và xác định lại ý nghĩa của "quy trình nền được lưu trong bộ nhớ cache". Trong trường hợp đó, bạn sẽ phải liên hệ với họ để xem chính xác họ định nghĩa nó như thế nào và nó bao gồm những gì.