0

私はJavaを数日しかプログラミングしていないので、優しくしてください... :P

私のアプリは SQLite データベースを使用して、ユーザーが提供するテキスト、写真、および場所を必要とするさまざまな「プロジェクト」を保存します。問題は、プロジェクトの一部を参照しているときに、ロード時にメモリ不足の例外が発生することです。

myImage.setImageURI(Uri.parse(msavePicture));

5回目の4回目。DDMS を使用すると、新しいロードごとに割り当てられたメモリが約 0.2Mbyte 増加することがわかります。問題を検索して使用してみました

myImage.setImageDrawable(null);

しかし、問題は残ります。また、コードを次のように変更しようとしました

  myBitmap = BitmapFactory.decodeFile(msavePicture);
  ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
  myImage.setImageBitmap(myBitmap);   

だから私は .recycle(); を使うことができます しかし、画像は読み込まれず、null が返されます。msavePicture は、次のような文字列です。

file:///mnt/sdcard/MyCameraApp/IMG_2011-12-09-01-49.jpg

私が含めた

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

マニフェストで、 setImageURI を使用すると機能するため、画像が存在することを知っています。

問題は、メモリリークを引き起こすために何が間違っているのか、ImageViewを本当に破壊する方法、またはなぜBitmapfactoryが私の文字列をデコードできないのか、ファイルの場所が間違っているのかということです.

念のため、多くのアクティビティを含めました。これに関する解決策やリンクは大歓迎です!

前もって感謝します!

(PS: SQLite データベースをサーバーに保存する方法を誰かが知っている場合は、それを使用して他の電話を更新することもできます! =) :DS)

  public class Page3 extends Activity {
private static final int ACTIVITY_CREATE = 0;
public static Long Row = (long) 40;
public static String summarydec = "FAIL";
public static String msavePicture;
public static Location loc;
private EditText mgps_lati;
private EditText mgps_long;
static String gps_long;
static String gps_lati;
private TodoDbAdapter mDbHelper;
public Location myLocation;
public static Bitmap myBitmap;
public Uri uBitmap;


@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    mDbHelper = new TodoDbAdapter(this);
    mDbHelper.open();
    setContentView(R.layout.camera);


        if(msavePicture == null){
        msavePicture = "";
    }
 //     myBitmap = BitmapFactory.decodeFile(msavePicture);
 //     ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
 //     myImage.setImageBitmap(myBitmap);       

    ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
    myImage.setImageURI(Uri.parse(msavePicture));

    mgps_long = (EditText) findViewById(R.id.gps_long); 
    mgps_lati = (EditText) findViewById(R.id.gps_lati);
    mgps_lati.setText("Latitude:  "+gps_lati);
    mgps_long.setText("Longitude: "+gps_long);
    ////////////////////////////////////////////////////////////
    ///// G P S  -  L Y S S N A R E ////////////////////////////
    ////////////////////////////////////////////////////////////    
    MyLocation myLocation = new MyLocation();
    myLocation.getLocation(this, locationResult);

    Button gps = (Button) findViewById(R.id.gps);
    gps.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

            if (gps_lati != null && gps_long != null) {
                mgps_lati.setText("Latitude:  " +gps_lati);
                mgps_long.setText("Longitude: " +gps_long);
                TodoDetails.save_gps_long = gps_long;
                TodoDetails.save_gps_lati = gps_lati;
                Page1.save_gps_long = gps_long;
                Page1.save_gps_lati= gps_lati;
                Page2.save_gps_long = gps_long;
                Page2.save_gps_lati= gps_lati;
                } else {
                    String Latitude = "Fel vid GPS-hanteringen, arra det!";
                    String Longitude = "Fel vid GPS-hanteringen, arra det!";
                    mgps_lati.setText(Latitude);
                    mgps_long.setText(Longitude);
                }
        }});
    ////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////

    Button camera = (Button) findViewById(R.id.camera);
    camera.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {                
            createCamera();
        }});

    Button confirmButton = (Button) findViewById(R.id.todo_edit_button);
    confirmButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {                
            setResult(RESULT_OK);
            TodoDetails.mPIC = msavePicture;
            Page1.mPIC = msavePicture;
            Page2.mPIC = msavePicture;
            ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
            myImage.setImageDrawable(null);
 //             myBitmap.recycle();
            cancelTimer();
            finish();
        }

    });
}
protected void onPause() {
    super.onPause();
    cancelTimer();
    ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
    myImage.setImageDrawable(null);

}
protected void cancelTimer()
{
    MyLocation myLocation = new MyLocation();
    myLocation.cancelTimer();   
}
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    cancelTimer();  
    ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
    myImage.setImageURI(Uri.parse(msavePicture));

 //     ImageView myImage = (ImageView) this.findViewById(R.id.camera_preview);
 //     myBitmap = BitmapFactory.decodeFile(msavePicture);
 //     myImage.setImageBitmap(myBitmap);

}
public void onBackPressed (){
    cancelTimer();  
    ImageView myImage = (ImageView) findViewById(R.id.camera_preview);
    myImage.setImageDrawable(null);
 //     Bitmap myBitmap = Page3.myBitmap;
//      myBitmap.recycle();
    finish();
}
////////////////////////////////////////////////////
////////////// A L L A   V Y E R ///////////////////
////////////////////////////////////////////////////
private void createPage1() {
    Intent b = new Intent(this, Page1.class);
    startActivityForResult(b, ACTIVITY_CREATE);
    setResult(RESULT_OK, b);
    finish();
}
private void createPage2() {
    Intent b = new Intent(this, Page2.class);
    startActivityForResult(b, ACTIVITY_CREATE);
    setResult(RESULT_OK, b);
}
private void createTodo() {
    Intent i = new Intent(this, TodoDetails.class);
    startActivityForResult(i, ACTIVITY_CREATE);
    setResult(RESULT_OK, i);
}
private void createCamera() {
    Intent c = new Intent(this, Camera.class);
    startActivityForResult(c, ACTIVITY_CREATE);
    setResult(RESULT_OK, c);
}
//////////////////////////////////////////////////////////
//////// M E N U  T O O L B A R //////////////////////////
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.projektlist, menu);
    return true;
}
public LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(final Location location){
        gps_lati = Double.toString(location.getLatitude());
        gps_long = Double.toString(location.getLongitude());
        }};
 }
4

1 に答える 1

0

ビットマップを ImageView のサイズに縮小する必要があります。例えば:

int ratio = widhtOriginal / widthImageView;
// Just an example, you should use more sophisticated algorithm

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = ratio;

InputStream inputStream = context.getContentResolver().openInputStream(uri);
// Will work for Uri's with "content" scheme,
// otherwise use BitmapFactory.decodeFile(String, Options) and so on

Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
于 2011-12-14T08:23:40.423 に答える