why this happeing all the time?i dont have even a bitmap to recycle and i dont know why my application throw memory error.
i select image from gallery here is the code to get an image from gallery then show it on some imageView.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
ImageView b = (ImageView) findViewById(R.id.viewImage);
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == 1) {
File f = new File(Environment.getExternalStorageDirectory().toString());
for (File temp : f.listFiles()) {
if (temp.getName().equals("temp.jpg")) {
f = temp;
break;
}
}
try {
Bitmap bitmap;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),
bitmapOptions);
b.setImageBitmap(bitmap);
String path = android.os.Environment
.getExternalStorageDirectory()
+ File.separator
+ "Phoenix" + File.separator + "default";
f.delete();
OutputStream outFile = null;
File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");
try {
outFile = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile);
outFile.flush();
outFile.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} else if (requestCode == 2) {
Uri selectedImage = data.getData();
String[] filePath = { MediaStore.Images.Media.DATA };
Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePath[0]);
String picturePath = c.getString(columnIndex);
c.close();
Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));
Log.w("path of image from gallery......******************.........", picturePath+"");
b.setImageBitmap(thumbnail);
b.setTag(picturePath);
}
}
}
after that there is 3 imagebuttons below user image(which picked from gallery). when user press on each one of them will get the name of that imageView drawable and will send to another activity then i want to watermark user image on that Imagebutton and show in one imageView
private static HashMap<Integer,String> activityMap = new HashMap<Integer,String>();
static {
activityMap.put( R.id.agahi1,"agahi1");
activityMap.put( R.id.agahi2,"agahi2");
}
// use this in the layout xml file for all the buttons onClick attribute
public void Clicked( View vw ) {
String a = String.valueOf(activityMap.get(vw.getId()));
Intent i = new Intent(this,fotCreator.class);
ImageView b = (ImageView) findViewById(R.id.viewImage);
String c = (String) b.getTag();
i.putExtra("image",c);
i.putExtra("frame",a);
startActivity(i);
}
this is the code for watermarker activity
package net.svncorp.shadikade;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class fotCreator extends ActionBarActivity {
private AsyncCaller myasync;
private ProgressBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fot_creator);
//progress bar
bar = (ProgressBar) this.findViewById(R.id.progressBar);
MainActivity.checkversion(this);
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}
@Override
protected void onResume() {
super.onResume();
myasync = new AsyncCaller();
myasync.execute();
}
private class AsyncCaller extends AsyncTask<Void, Void, Drawable>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
bar.setVisibility(View.VISIBLE);
}
@Override
protected Drawable doInBackground(Void... params) {
try { // simulate here the slow activity
Intent intent = getIntent();
final String frame = intent.getStringExtra("frame");
String image = intent.getStringExtra("image");
Resources resources = getResources();
int id = resources.getIdentifier(frame, "drawable", getPackageName());
Drawable d = resources.getDrawable(id);
return d;
} catch (Exception e1) {
e1.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Drawable result) {
super.onPostExecute(result);
//this method will be running on UI thread
ImageView finalimage = (ImageView)findViewById(R.id.finalimage);
if (isCancelled() || result == null) {
return;
}
finalimage.setImageDrawable(result);
bar.setVisibility(View.GONE);
}
}
@Override
protected void onPause() {
super.onPause();
myasync.cancel(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_fot_creator, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
now this code works so fast for 2 or 3 times of pressing imagebuttons and go to watermarker activty but its keep getting slower and slower and sometimes it freeze in emulator and i see these in logcat
11-24 15:01:45.960 7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 2419(163KB) AllocSpace objects, 1(1047KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms
11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 1047KB allocation
11-24 15:01:48.790 7751-7768/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 1303(86KB) AllocSpace objects, 1(993KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms
11-24 15:01:53.700 7751-7751/net.svncorp.shadikade I/Choreographer﹕ Skipped 1272 frames! The application may be doing too much work on its main thread.
11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 993KB allocation
11-24 15:01:55.380 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.380 7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 218(9KB) AllocSpace objects, 0(0B) LOS objects, 5% free, 15MB/16MB, paused 0 total 30ms
11-24 15:01:55.380 7751-7769/net.svncorp.shadikade E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB until OOM"
11-24 15:01:55.380 7751-7769/net.svncorp.shadikade D/skia﹕ --- decoder->decode returned false
11-24 15:01:55.380 7751-7769/net.svncorp.shadikade E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
Process: net.svncorp.shadikade, PID: 7751
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB 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.Resources.getDrawable(Resources.java:758)
at android.content.res.Resources.getDrawable(Resources.java:724)
at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:65)
at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:45)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
i think this is the problem of many others like me... Any help will be appreciated.
1) An easy way to solve OutOfMemoryError in java is to increase the maximum heap size by using JVM options "-Xmx512M", this will immediately solve your OutOfMemoryError.
OutOfMemoryError exception. Usually, this error is thrown when there is insufficient space to allocate an object in the Java heap. In this case, The garbage collector cannot make space available to accommodate a new object, and the heap cannot be expanded further.
An out of memory error causes programs — or even the entire computer — to power down. This problem is typically caused either by low random access memory (RAM), too many programs or hardware pieces running at once, or a large cache size that absorbs a large amount of memory.
Maybe adding this line in Manifest on application tags will help you;
<application
...
...
android:largeHeap="true" >
......
......
</application>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With