Перемещение вида в AsyncTask

У меня есть класс (SpotDetails), который включает в себя фрагмент, который рисуется программно. До сих пор у меня был класс рисования фрагментов (WindRose) как потомок основного класса.

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

Код для реализации WindRose:

WindRose windRose = new WindRose(SpotDetails.this);
    //Add a new windRose (Which is created under)
    FrameLayout.addView(windRose);

WindRose код:

   public class WindRose extends View {

    public WindRose(Context context) {
        super(context);


    }

    @Override

    protected void onDraw(Canvas canvas) {


        super.onDraw(canvas);


        float height = (float) getHeight();
        float width = (float) getWidth();

        float radius;

        if (width > height) {
            radius = height / 2;

        } else {
            radius = width / 2;
        }

        // radius = (height )/ 2;


        Path path = new Path();
        path.addCircle(width, height, radius, Path.Direction.CCW);

        // / 2

        Resources resources = getResources();
        int color = resources.getColor(R.color.green_back);

        Paint paint = new Paint();

        paint.setColor(color);
        paint.setStrokeWidth(5);

        paint.setStyle(Paint.Style.FILL);
        float center_x, center_y;
        center_x = width / 2;
        center_y = height / 2;

        final RectF oval = new RectF();

        //Formulas :
        //SD = Start Degree
        //ED = End Degree

        //If cakepiece passes 0 (East)
        //SD, 360-(SD+ED)

        //Else :
        //SD, (ED-SD)

        oval.set(center_x - radius, center_y - radius, center_x + radius, center_y + radius);

        if (End > Start) {
            canvas.drawArc(oval, Start, (End - Start), true, paint);

        } else if (End < Start) {
            canvas.drawArc(oval, Start, ((360 - Start) + End), true, paint);
        }


    }
}

Я не уверен, правильно ли я все объяснил, поэтому, пожалуйста, скажите мне, если что-то неясно:)

Я пытался сделать это:

public class WindRose extends Activity {
float Start, End;
Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

public View DrawRose (Context context){
    this.context = context;
    WindRoseDrawer windRoseDrawer = new WindRoseDrawer(context);

    return null; //What should i return here ? 


}


private class DrawWindRose extends AsyncTask<String, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(String... strings) {


        return null;

    }


    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }
}



public class WindRoseDrawer extends View {

    public WindRoseDrawer(Context context) {
        super(context);


    }

    @Override

    protected void onDraw(Canvas canvas) {


        super.onDraw(canvas);


        float height = (float) getHeight();
        float width = (float) getWidth();

        float radius;

        if (width > height) {
            radius = height / 2;

        } else {
            radius = width / 2;
        }

        // radius = (height )/ 2;


        Path path = new Path();
        path.addCircle(width, height, radius, Path.Direction.CCW);

        // / 2

        Resources resources = getResources();
        int color = resources.getColor(R.color.green_back);

        Paint paint = new Paint();

        paint.setColor(color);
        paint.setStrokeWidth(5);

        paint.setStyle(Paint.Style.FILL);
        float center_x, center_y;
        center_x = width / 2;
        center_y = height / 2;

        final RectF oval = new RectF();

        //Formulas :
        //SD = Start Degree
        //ED = End Degree

        //If cakepiece passes 0 (East)
        //SD, 360-(SD+ED)

        //Else :
        //SD, (ED-SD)

        oval.set(center_x - radius, center_y - radius, center_x + radius, center_y + radius);

        if (End > Start) {
            canvas.drawArc(oval, Start, (End - Start), true, paint);

        } else if (End < Start) {
            canvas.drawArc(oval, Start, ((360 - Start) + End), true, paint);
        }


    }
}


}

Но как я должен реализовать это обратно в SpotDetails? И что я должен вернуть из DrawRose?

1 ответ

Вы должны рисовать только в потоке пользовательского интерфейса. Вы не можете рисовать в фоновом режиме, если используете метод наследования Draw из View. Лучше использовать SurfaceView с блокировкой / разблокировкой холста. Он будет использовать оптимизированный алгоритм, который позволяет рисовать фон.

@Override
public void run() {
    while(locker){
     //checks if the lockCanvas() method will be success,and if not, will check this statement again
     if(!holder.getSurface().isValid()){
         continue;
     }
     /** Start editing pixels in this surface.*/
     Canvas canvas = holder.lockCanvas();

     //ALL PAINT-JOB MAKE IN draw(canvas); method.
      draw(canvas);

     // End of painting to canvas. system will paint with this canvas,to the surface.
     holder.unlockCanvasAndPost(canvas);
   }
}
Другие вопросы по тегам