Код працює на API 8 і не може працювати з API 9 або 10

Чомусь мій код відмінно працює для Froyo (API 8), але при спробі запустити його на API 9 або 10, AVD та телефони дають мені те саме повідомлення про помилку. Будь-яка ідея про те, чому? Мій код для перегляду:

Всі сторінки виглядають схожими на ViewActivity.java. тільки відмінність id drawable викликається.

ViewActivity.java:

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;

    public class ViewActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //creates view
    TouchImageView img = new TouchImageView(this);
    //sets image
    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.largeimage1);
    img.setImageBitmap(image);
    img.setMaxZoom(3f);
    setContentView(img); 
}
    //Creates the options menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.echooptions, menu);
    return true;
}
//Starts the chosen menu activity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.back_item:
        Intent intentb = new Intent(this, page16.class);
        startActivity(intentb);
        return true;
    case R.id.next_item:
        Intent intentn = new Intent(this, page2.class);
        startActivity(intentn);
        return true;
    case R.id.about_menu_item:
        Intent intenta = new Intent(this, AboutActivity.class);
        startActivity(intenta);
        return true;
    case R.id.tablecontents:
        return true;
    case R.id.page1:
        Intent intent1 = new Intent(this, ViewActivity.class);
        startActivity(intent1);
        return true;
    case R.id.page2:
        Intent intent2 = new Intent(this, page2.class);
        startActivity(intent2);
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
    }

TouchImageView.java:

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.view.MotionEvent;
    import android.view.ScaleGestureDetector;
    import android.view.View;
    import android.widget.ImageView;

    public class TouchImageView extends ImageView {

Matrix matrix = new Matrix();

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;

float redundantXSpace, redundantYSpace;

float width, height;
static final int CLICK = 3;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;

ScaleGestureDetector mScaleDetector;

Context context;


public TouchImageView(Context context) {
    super(context);
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix.setTranslate(1f, 1f);
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);

            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = DRAG;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float scaleWidth = Math.round(origWidth * saveScale);
                        float scaleHeight = Math.round(origHeight * saveScale);
                        if (scaleWidth < width) {
                            deltaX = 0;
                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom); 
                        } else if (scaleHeight < height) {
                            deltaY = 0;
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);
                        } else {
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);

                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom);
                        }
                        matrix.postTranslate(deltaX, deltaY);
                        last.set(curr.x, curr.y);
                    }
                    break;

                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true;//indicate event was handled
        }

    });
}

@Override
public void setImageBitmap(Bitmap bm) { 
    super.setImageBitmap(bm);
    bmWidth = bm.getWidth();
    bmHeight = bm.getHeight();
}

public void setMaxZoom(float x)
{
    maxScale = x;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float mScaleFactor = (float)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05);
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale) {
            saveScale = maxScale;
            mScaleFactor = maxScale/origScale;
        } else if (saveScale < minScale) {
            saveScale = minScale;
            mScaleFactor = minScale/origScale;
        }
        right = width * saveScale - width - (2 * redundantXSpace * saveScale);
        bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
        if (origWidth * saveScale <= width || origHeight * saveScale <= height) {
            matrix.postScale(mScaleFactor, mScaleFactor, width/2, height/2);
            if (mScaleFactor < 1) {
                matrix.getValues(m);
                float x = m[Matrix.MTRANS_X];
                float y = m[Matrix.MTRANS_Y];
                if (mScaleFactor < 1) {
                    if (Math.round(origWidth * saveScale) < width) {
                        if (y < -bottom)
                            matrix.postTranslate(0, -(y + bottom));
                        else if (y > 0)
                            matrix.postTranslate(0, -y);
                    } else {
                        if (x < -right) 
                            matrix.postTranslate(-(x + right), 0);
                        else if (x > 0) 
                            matrix.postTranslate(-x, 0);
                    }
                }
            }
        } else {
            matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());
            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            if (mScaleFactor < 1) {
                if (x < -right) 
                    matrix.postTranslate(-(x + right), 0);
                else if (x > 0) 
                    matrix.postTranslate(-x, 0);
                if (y < -bottom)
                    matrix.postTranslate(0, -(y + bottom));
                else if (y > 0)
                    matrix.postTranslate(0, -y);
            }
        }
        return true;

    }
}

@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = MeasureSpec.getSize(heightMeasureSpec);
    //Fit to screen.
    float scale;
    float scaleX =  (float)width/(float)bmWidth;
    float scaleY = (float)height/(float)bmHeight;
    scale = Math.min(scaleX, scaleY);
    matrix.setScale(scale, scale);
    setImageMatrix(matrix);
    saveScale = 1f;

   //Center the image
    redundantYSpace = (float)height - (scale * (float)bmHeight) ;
    redundantXSpace = (float)width - (scale * (float)bmWidth);
    redundantYSpace /= (float)2;
    redundantXSpace /= (float)2;

    matrix.postTranslate(redundantXSpace, redundantYSpace);

    origWidth = width - 2 * redundantXSpace;
    origHeight = height - 2 * redundantYSpace;
    right = width * saveScale - width - (2 * redundantXSpace * saveScale);
    bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
    setImageMatrix(matrix);
}
    }
0
Потрібно опублікувати logcat тут.
додано Автор slkorolev, джерело

1 Відповіді

InstantiationException: mil.Army.page2 implies it can't create an instance of class page2. I think this is usually thrown when you try to instantiate an abstract class or interface. According to this it can be thrown because the class doesn't have a default (zero-argument) constructor. I don't know why it would work only on API 8 since this seems to be a Java issue, but it seems to be a possible cause.

EDIT: May also try to simply rebuild the project. In Eclipse, just clean it by going to Project->Clean.

EDIT: Я також натрапив на це, що, здається, стосується б:

Why do I get an InstantiationException if I try to start a service?

0
додано
Можливо, ви сильно кодуєте мітку, а не використовуєте ресурс String відповідно до цього питання: title stackoverflow.com/questions/5740893/…
додано Автор DeeV, джерело
Це повідомлення може означати, що ви виділяєте масив або об'єкт, який просто шлях до великого (можливо, зображення). Ви повинні з'ясувати, де ви виділяєте великі шматки за раз і дізнаєтеся, чи можете ви його вирізати. Я б хотів, щоб я міг сказати вам, чому це впливає лише на пізні API. Теоретично, якщо програма працює в API 8, вона також буде працювати в API 9+.
додано Автор DeeV, джерело
Ну, я не знаю, які функціональні відмінності між цими API. Я думаю, що це може бути схожим на недавні проблеми API 14, у яких люди, у яких ідентифікатори, створені в файлі R, більше не оголошуються final . Вони зробили це так, щоб ідентифікаційні номери змінювалися, щоб запобігти зіткненню з спільними бібліотеками. 99% часу, це абсолютно нічого не зачіпає. Проте, твердження Java switch , які використовували ідентифікатори як ключі, більше не збираються, і всі повинні були перетворити їх у statements elsewhere. Я просто не впевнений, що це причина.
додано Автор DeeV, джерело
Проблема все одно виникає: '10 -28 14: 45: 17.827: ERROR/dalvikvm-куча (774): 8420100-байтовий зовнішній розподіл занадто великий для цього процесу. 10-28 14: 45: 17.851: ERROR/GraphicsJNI (774): VM не дозволить нам виділити 8420100 байт "Дякую за допомогу до цього DeeV.
додано Автор Abel8658, джерело
Однією з причин, що я не люблю теорію, вона, як правило, не працює таким чином ... але спасибі за допомогу, якщо я зрозумію це, я розміщую повідомлення про те, що я зробив, щоб виправити це. Дякую за свій час DeeV.
додано Автор Abel8658, джерело
Схоже, що це було викликано завантаженням моїх зображень. Я змінив їх усі на .gif, які менше, ніж у .jpegs, і тепер я можу отримувати більше моїх сторінок щоразу. Дякую за те, що дали мені цю ідею, як це виглядає як виправлення. Це цікаво про API 14, і перемикач/якщо-ще. Я стежу за цим. Ще раз спасибі за всю вашу допомогу.
додано Автор Abel8658, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.