почему это happeing все время? У меня нет даже растрового изображения, чтобы переработать, и я не знаю, почему мое приложение выбрасывает ошибку памяти.
Я выбираю изображение из галереи здесь - это код, чтобы получить изображение из галереи, а затем показать его на каком-то изображении.
@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);
}
}
}
после этого на изображении пользователя появляется 3 кнопки изображения (которые выбраны из галереи). когда пользователь нажимает на каждый из них, вы получите имя этого образа Image drawable и отправите другому мероприятию, тогда я хочу, чтобы на нем было изображение водяного знака на этом изображении и показано в одном изображении.
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);
}
это код активности водяного знака
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);
}
}
теперь этот код работает так быстро в 2 или 3 раза нажатием кнопок изображения и переходит к активности водяного знака, но он продолжает замедляться и замедляться, а иногда он замирает в эмуляторе, и я вижу их в 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)
Я думаю, что это проблема многих других, таких как я... Любая помощь будет оценена.