如何从 Asynctask 重绘我的视图?

问题描述 投票:0回答:1

我的 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 再也不会被调用。

android android-asynctask ondraw android-view-invalidate
1个回答
0
投票

首先-你不应该再使用AsyncTask。事实上,你根本不应该这样做,课程有问题,而且许多/大多数人都错误地使用了它。

其次,你不会不断地调用invalidate。 AsyncTask 运行一次。你的没有循环,所以它会被调用一次。

第三,AsyncTask 永远不应该有无限循环——如果有,你将导致所有其他 AsyncTask 死锁。如果您希望某些内容在后台定期运行,请使用 Thread、协程、TimerTask 或其他类似的构造(如果您想重复执行某些操作)。

第四,从 AsyncTask 中,您需要 postInvalidate,而不是 invalidate。 invalidate 仅是主线程。

第五,重写 invalidate 是一种巨大的代码味道。几乎永远不应该这样做。我担心你会尝试。我并不是说这是错误的,但很有可能是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.