我有一个应用程序,我从服务器加载图像。因此,我的应用程序导致Outofmemory错误。 我已经捕获了异常,因此我的应用程序现在可以防止被强制关闭。但我的应用程序停止在发生异常的地方加载图像。因此,有一种方法可以在捕获异常后重新启动我的活动,以便释放我的内存并且活动再次从第一个加载图像。
急需。任何帮助表示赞赏。
答案 0 :(得分:0)
一般情况下你不应该捕捉错误,特别是OutOfMemoryError。 在OOM之后,您永远无法确定应用程序的状态。
相反,您应该考虑改进算法,以便不会发生OOM。 描述具体的用例(可能在单独的问题中),有人可以为您提供建议。
答案 1 :(得分:0)
突然重启当前活动不会是一个很棒的用户体验。 如果可能,请尝试从内存中清除未向用户显示的图像(因此它会释放已占用的内存)。
如果您仍想重新启动当前活动,请使用以下命令:
void restartActivity()
{
CurrentActivity.this.finish();
Intent mIntent = new Intent(CurrentActivity.this, CurrentActivity.class);
startActivity(CurrentActivity);
}
答案 2 :(得分:0)
您使用未知异常处理程序在应用程序崩溃时收到通知,从那里您可以再次加载您的活动。 但非常重要你确保这种情况只发生在你看到独角兽的次数上。最好解决问题而不是解决问题。
这是一个有助于UEH的链接:How do I obtain crash-data from my Android application?
答案 3 :(得分:0)
我认为问题在于从服务器加载图像,这会增加内存,导致应用程序出现OutOfMemmory错误。 你必须避免你的应用程序占用如此巨大的内存。你可以使用 LazyLoading 概念加载图片。
或查看here also
public class DrawableManager {
private final Map<String, Drawable> drawableMap;
public DrawableManager() {
drawableMap = new HashMap<String, Drawable>();
}
public Drawable fetchDrawable(String urlString) {
if (drawableMap.containsKey(urlString)) {
return drawableMap.get(urlString);
}
Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawableMap.put(urlString, drawable);
Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
+ drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
+ drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
return drawable;
} catch (MalformedURLException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
} catch (IOException e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
return null;
}
}
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
if (drawableMap.containsKey(urlString)) {
imageView.setImageDrawable(drawableMap.get(urlString));
}
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
imageView.setImageDrawable((Drawable) message.obj);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//TODO : set imageView to a "pending" image
Drawable drawable = fetchDrawable(urlString);
Message message = handler.obtainMessage(1, drawable);
handler.sendMessage(message);
}
};
thread.start();
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
由于 迪帕克
答案 4 :(得分:0)
Intent intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);
这将刷新或重新启动活动。