我的 MainActivity 中有一个框,我想绘制从麦克风录制的声音数据。我无法让框视图再次调用 onDraw 并根据从 AsyncTask 获取的数据进行更新。
我的视图类在它自己的文件中..
public class MyView extends View {...
int radius = 0;
public start(MainActivity acitivity){
new MyAsyncTask(activity).execute();
}
@Override
protected void onDraw(Canvas canvas){
canvas.DrawCircle(contentWidth >> 1, contentHeight >> 1, radius, circlePaint);
@Override
protected void invalidate()...
public static class MyAsyncTask extends AsyncTask{...
@Override
protected void onProgressUpdate(Void... progress){
activityReference.get().findViewById(R.id.my_view).invalidate();
我的主要活动..
public class MainActivity..
onCreate(){
MyView myView = findViewById(R.id.my_view);
myView.setWillNotDraw(false);
myView.start(this);
我的应用程序画了一个圆圈但不会更新。我不断地从 AsyncTask 的 onProgressUpdate 调用 invalidate,但 onDraw 再也不会被调用。
首先-你不应该再使用AsyncTask。事实上,你根本不应该这样做,课程有问题,而且许多/大多数人都错误地使用了它。
其次,你不会不断地调用invalidate。 AsyncTask 运行一次。你的没有循环,所以它会被调用一次。
第三,AsyncTask 永远不应该有无限循环——如果有,你将导致所有其他 AsyncTask 死锁。如果您希望某些内容在后台定期运行,请使用 Thread、协程、TimerTask 或其他类似的构造(如果您想重复执行某些操作)。
第四,从 AsyncTask 中,您需要 postInvalidate,而不是 invalidate。 invalidate 仅是主线程。
第五,重写 invalidate 是一种巨大的代码味道。几乎永远不应该这样做。我担心你会尝试。我并不是说这是错误的,但很有可能是错误的。