Из кода, который вы разместили, большинство операций в функции не связаны с представлением.Единственная часть, которая взаимодействует с видом, - это операция рисования холста.Итак, как было отмечено в комментариях, вы должны выполнить все вычисления в рабочем потоке, а затем вызвать runOnUIThread с runnable, чтобы сделать окончательный рисунок на холсте.Вызов runOnUIThread предотвратит появление android ошибки, которая возникает, когда вы изменяете представление из рабочего потока, не привязанного к пользовательскому интерфейсу.
Здесь вы можете выбрать следующие опции: AsyncTask и классы потоков.В моем примере ниже я использую AyncTask.
void draw_beautiful(Canvas canvas) {
MyDrawingWorkerTask myDrawingWorkerTask = new MyDrawingWorkerTask(this);
myDrawingWorkerTask.execute(canvas);
}
/**
* A class for doing a lot of the work in a background
*/
private static class MyDrawingWorkerTask extends AsyncTask<Canvas, Void, Void> {
private final Activity activity;
public MyDrawingWorkerTask(Activity activity) {// add more parameters to use to set other variables like cloud_number, etc
this.activity = activity;
}
// This is where the work is being done
@Override
protected Void doInBackground(Canvas... canvases) {
final Canvas canvas = canvases[0];
final Paint mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
int vt = 0;
float x1 = 0f;
float y1 = 0f;
int style = 0;
for (int i = 0; i < cloud_number; i++) {
vt = i * 4 - 3;
style = mt_cloud[vt];
x1 = mt_cloud[vt + 2].toFloat();
y1 = mt_cloud[vt + 3].toFloat();
Bitmap ob = canvas_cloud1;
if (style == 0) ob = canvas_cloud1;
else if (style == 1) ob = canvas_cloud2;
else if (style == 2) ob = canvas_cloud3;
Bitmap finalOb = ob;
float finalX = x1;
float finalY = y1;
// note that this is what interacts with the view
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
canvas.drawBitmap(finalOb, finalX, finalY, mPaint);
}
});
}
return null;
}
}