0

Имеется два класса - основной и для рисования. При запуске определенного алгоритма, происходит поиск координаты нужной точки, а затем координаты передаются в класс рисования, и класс рисует точку. Но почему то не могу изменить поле для хранения координат в классе рисования.

Причем в основном классе реализован обработчик касания, который получает координаты нажатия на экран и рисует прямоугольник, там происходит также изменение полей класса DrawView, но без всяких ошибок.

Ошибка:

Process: com.example.vitalja.stars, PID: 27911
java.lang.NullPointerException: Attempt to write to field 'int com.example.vitalja.stars.DrawView.x_draw' on a null object reference
    at com.example.vitalja.stars.MainActivity.findAlgorithm(MainActivity.java:180)
    at com.example.vitalja.stars.MainActivity.decodeYUV420SP(MainActivity.java:219)
    at com.example.vitalja.stars.ShowCamera.onPreviewFrame(ShowCamera.java:110)
    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1188)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5451)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

MainActivity:

public class MainActivity extends AppCompatActivity {
DrawView drawView;
....
protected void onCreate(Bundle savedInstanceState) {
 ....
  drawView = findViewById(R.id.drawViewID); 
  ....
}
public void findAlgorithm(int[] rgb, int width, int height) {
    Log.d("My Algorithm", "surface_algh");
    int color_red, color_green, color_blue, curr_color, index;
    double tmp_GR;
    int x = X_touch + 50;
    int y = Y_touch + 50;
            index = (height * y) + x;
            curr_color = rgb[index];
            color_green = Color.green(curr_color);
            color_red = Color.red(curr_color);
            color_blue = Color.blue(curr_color);
            tmp_GR = (0.299 * color_red) + (0.587 * color_green) + (0.114 * color_blue);
            if (tmp_GR > max_GR) {
                max_GR = tmp_GR;
                max_brightness_X = x;
                max_brightness_Y = y;
    }
    drawView.x_point = max_brightness_X;
    drawView.y_point = max_brightness_Y;
    drawView.draw_point = 1;
    drawView.invalidate();
}
 }

DrawView

public class DrawView extends View {

Paint p;

ShowCamera showCamera;

public int x_draw, y_draw;
public int x_point, y_point;
public int draw_state = 0;
public int draw_point = 0;

public DrawView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public DrawView (Context context){
    super (context);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();
    paint.setStrokeWidth(10);
    paint.setColor(Color.BLUE);
    paint.setStyle(Paint.Style.STROKE);

    Paint paint_dot = new Paint();
    paint_dot.setStrokeWidth(10);
    paint_dot.setColor(Color.RED);

    if (draw_state == 1) {
        canvas.drawRect(x_draw, y_draw, x_draw + 100, y_draw + 100, paint);
    }
    if (draw_point == 1){
        canvas.drawPoint(x_point, y_point, paint_dot);
    }

}
}

ShowCamera.onPreviewFrame

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
    if (scanSpace) {
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("surfaceface", "surface onpreviewframe");
        int frameHeight = camera.getParameters().getPreviewSize().height;
        int frameWidth = camera.getParameters().getPreviewSize().width;
        // number of pixels//transforms NV21 pixel data into RGB pixels
        int rgb[] = new int[frameWidth * frameHeight];
        mainActivity.decodeYUV420SP(rgb, data, frameWidth, frameHeight, startX, startY);
    }
    }

Из MainActivity Вызов активности:

public void btnTrackingOnClick(View view) {
    if (!isTracking){
     isTracking = true;
     showCamera.scanSpace = true;
     btn_tracking.setText("Прекратить");
    }
    else {
        isTracking = false;
        showCamera.scanSpace = false;
        btn_tracking.setText("Отследить");
    }
}
  • x_draw не инициализирован – Jarvis_J Jan 28 '19 at 11:22
  • Что-то приложенный код не соответствует стеку ошибки. Судя по стеку в методе findAlgorithm должна быть запись в поле DrawView.x_draw. Сделайте пересборку проекта (Build -> Rebuild project) и попробуйте ещё. – woesss Jan 28 '19 at 11:35
  • @woesss, попробовал - не помогло. Сам без понятия почему так, в другой функции поля изменяются нормально.. – Vitalja B. Jan 28 '19 at 12:11
  • Метод ShowCamera.onPreviewFrame покажите и как в этом классе получена ссылка на активность. – woesss Jan 28 '19 at 12:17
  • @woesss, добавил – Vitalja B. Jan 28 '19 at 12:23
  • Я имел ввиду как и где инициализирована ссылка mainActivity в этом классе - передана или создана через new? – woesss Jan 28 '19 at 12:39
  • @woesss, MainActivity mainActivity = new MainActivity(); – Vitalja B. Jan 28 '19 at 12:42
  • В этом и проблема. Так Вы создаёте новый экземпляр класса, который никак не связан с реальной, запущенной активностью. Вместо этого нужно передать ссылку через конструктор, метод или как-то ещё, либо построить код так, чтобы она не понадобилась - например перенести методы по месту использования (если возможно). – woesss Jan 28 '19 at 14:05
  • @woesss, подскажите пожалуйста, как можно передать ссылку? Какой-нибудь пример – Vitalja B. Jan 28 '19 at 16:02

0 Answers0