я действительно работал над этим вопросом, но не могу найти решение ожидать, что это неестественно https://stackoverflow.com/a/2866717/2008040OutOfMemoryError если перезапустить законченную деятельность с ViewPager
I обладает активностью (WebViewActivityForHeadlines), который начинается с моей основной деятельности, эта деятельность содержит пользовательский просмотр пейджера (такое же поведение происходит, когда я использую стандартный просмотр пейджера), и этот просмотр пейджера раздувает пользовательские масштабируемые изображения (такое же поведение происходит, когда я использую стандартный просмотр изображений).
Ниже вы можете найти код деятельности, я просто вырезал некоторые несвязанные части.
@Fullscreen
@EActivity(R.layout.activity_web_view_for_headlines)
public class WebViewActivityForHeadlines extends BaseActivity
{
/** The log tag. */
private static final String LOG_TAG = WebViewActivityForHeadlines.class.getSimpleName();
private static int NUM_PAGES;
private static String CURRENT_URL = "";
private static String CURRENT_TITLE = "";
HeadlineListAdapter headlineListAdapter = GazetelikApplication.headlineListAdapter;
@ViewById(R.id.mPager)
public static JazzyViewPager MPAGER;
PagerAdapter mPagerAdapter;
@Bean
GazetelikSharingHelper gazetelikSharingHelper;
@ViewById
Button webViewButtonBack;
@ViewById
Button webViewButtonForward;
@ViewById
Button webViewButtonHome;
@ViewById
Button webViewButtonHide;
@ViewById
Button webViewButtonShare;
@ViewById
Button webViewButtonClose;
@ViewById(R.id.webViewControlPanel)
RelativeLayout controlPanel;
@ViewById(R.id.upperLayout)
RelativeLayout upperLayout;
@ViewById(R.id.mainRelativeLayout)
RelativeLayout mainLayout;
@ViewById(R.id.webViewShowControlPanelPanel)
RelativeLayout showControlPanelPanel;
Boolean isFirstRun = true;
Integer orderIdOfStart = null;
String tinyUrlString = "";
boolean isTinyUrlReady;
int tinyUrlCount;
// ProgressDialog mProgressDialog;
/** The view to show the ad. */
private AdView adView;
final Activity thisActivity = this;
DisplayImageOptions options;
Resources res;
@SuppressLint("NewApi")
@AfterViews
void afterViews()
{
NUM_PAGES = headlineListAdapter.getCount();
Intent thisIntent = getIntent(); // gets the previously created intent
orderIdOfStart = thisIntent.getIntExtra("orderId", 0);
mPagerAdapter = new ImageAdapter();
MPAGER.setAdapter(mPagerAdapter);
MPAGER.setCurrentItem(orderIdOfStart);
MPAGER.setTransitionEffect(JazzyViewPager.TransitionEffect.Accordion);
View decorView = getWindow().getDecorView();
if (Build.VERSION.SDK_INT == 14 || Build.VERSION.SDK_INT == 15)
{
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
decorView.setSystemUiVisibility(uiOptions);
}
else if (Build.VERSION.SDK_INT >= 16)
{
if (Build.VERSION.SDK_INT >= 19)
{
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
getTemporaryCache().setWebViewControlPanelVisible(true);
}
else
{
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
}
res = getResources();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher)
.showImageForEmptyUri(R.drawable.ic_launcher)
.cacheInMemory(false)
.build();
}
/** Called before the activity is destroyed. */
@Override
public void onDestroy()
{
try
{
upperLayout.removeAllViews();
mainLayout.removeAllViews();
mPagerAdapter = null;
MPAGER.removeAllViews();
}
catch (Exception e)
{
Toast.makeText(thisActivity, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
super.onDestroy();
}
@Click(R.id.webViewButtonBack)
void onButtonBackClick()
{
int desiredPage = MPAGER.getCurrentItem() - 1;
if (desiredPage < 0)
{
desiredPage = 0;
}
if (desiredPage > mPagerAdapter.getCount())
{
desiredPage = mPagerAdapter.getCount();
}
MPAGER.setCurrentItem(desiredPage);
}
@Click(R.id.webViewButtonForward)
void onButtonForwardClick()
{
int desiredPage = MPAGER.getCurrentItem() + 1;
if (desiredPage < 0)
{
desiredPage = 0;
}
if (desiredPage > mPagerAdapter.getCount())
{
desiredPage = mPagerAdapter.getCount();
}
MPAGER.setCurrentItem(desiredPage);
}
@Click(R.id.webViewButtonHome)
void onButtonHomeClick()
{
MPAGER.setCurrentItem(orderIdOfStart);
}
@Click(R.id.webViewButtonHide)
void onButtonHideClick()
{
upperLayout.removeView(controlPanel);
showControlPanelPanel.setVisibility(RelativeLayout.VISIBLE);
}
@Click(R.id.webViewButtonClose)
void onButtonCloseClick()
{
finish();
}
@Click(R.id.webViewButtonShare)
void onButtonShareClick()
{
...
}
@Background
void buildTinyUrl(String longUrl)
{
...
}
@UiThread
void onOtherShareButtonClickTask(String url)
{
...
}
@UiThread
void onFacebookShareButtonClickTask(String url)
{
...
}
@UiThread
void onTwitterShareButtonClickTask(String url)
{
...
}
@Click(R.id.webViewButtonShow)
void onButtonShowClick()
{
upperLayout.addView(controlPanel);
showControlPanelPanel.setVisibility(RelativeLayout.INVISIBLE);
}
@UiThread
void popupToast(String message)
{
if (message != null)
{
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
RelativeLayout layout = (RelativeLayout) findViewById(R.id.headlinesForAddRelativeLayout);
layout.removeView(adView);
if (adView != null)
{
// Destroy the AdView.
adView.destroy();
}
super.onConfigurationChanged(newConfig);
}
@Override
public void onBackPressed()
{
if (orderIdOfStart == MPAGER.getCurrentItem())
{
super.onBackPressed();
}
else if (MPAGER.getCurrentItem() > orderIdOfStart)
{
MPAGER.setCurrentItem(MPAGER.getCurrentItem() - 1);
}
else if (MPAGER.getCurrentItem() < orderIdOfStart)
{
MPAGER.setCurrentItem(MPAGER.getCurrentItem() + 1);
}
}
private class ImageAdapter extends PagerAdapter
{
private LayoutInflater inflater;
ImageAdapter()
{
inflater = LayoutInflater.from(thisActivity);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
container.removeView((View) object);
}
@Override
public int getCount()
{
return NUM_PAGES;
}
@Override
public Object instantiateItem(ViewGroup view, int position)
{
View imageLayout = inflater.inflate(R.layout.simple_image_view, view, false);
assert imageLayout != null;
final TouchImageView imageView = (TouchImageView) imageLayout.findViewById(R.id.image);
final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading);
ImageLoader.getInstance().displayImage(headlineListAdapter.getItem(position).getUrl(), imageView, options, new SimpleImageLoadingListener()
{
@Override
public void onLoadingStarted(String imageUri, View view)
{
spinner.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason)
{
String message = null;
switch (failReason.getType()) {
case IO_ERROR:
message = "Input/Output error";
break;
case DECODING_ERROR:
message = "Image can't be decoded";
break;
case NETWORK_DENIED:
message = "Downloads are denied";
break;
case OUT_OF_MEMORY:
message = "Out Of Memory error";
break;
case UNKNOWN:
message = "Unknown error";
break;
}
Toast.makeText(thisActivity, message, Toast.LENGTH_SHORT).show();
spinner.setVisibility(View.GONE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
{
spinner.setVisibility(View.GONE);
imageView.setZoom(1F);
}
});
view.addView(imageLayout, 0);
return imageLayout;
}
@Override
public boolean isViewFromObject(View view, Object object)
{
return view.equals(object);
}
@Override
public void restoreState(Parcelable state, ClassLoader loader)
{
}
@Override
public Parcelable saveState()
{
return null;
}
}
}
Когда я начала эту работу первый раз, я вижу куча будет идти немного вверх, как вид пейджер раздувает 3 вид и все в порядке, когда я перемещаться между десятками изображений. Я отчетливо вижу, что когда я заканчиваю эту активность, память не освобождается системой, и если я снова и снова начну эту деятельность, я получу OOME, как ожидалось.
Это выход LogCat
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:78)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:264)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:237)
at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Не могли бы вы, ребята, пожалуйста, помогите мне найти утечку памяти?
Я переместил загрузчик изображений в качестве одноэлементного компонента и ввел этот компонент в класс приложения. Я использовал только ссылку на bean из моего приложения при проблемной деятельности. Но все же куча растет каждый раз, когда я перезапускаю активность. –