gpt4 book ai didi

java - 异步任务 : invalidating view does not take effect

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:33 24 4
gpt4 key购买 nike

更新

我的小陈列柜存储在Bitbucket上

https://bitbucket.org/solvapps/animationtest

我有一个带有 View 的 Activity 。 Contentview 设置为此 View 。

public class MainActivity extends AppCompatActivity {

private MyView myView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myView = new MyView(this);
setContentView(myView);
startMovie();
}

public void startMovie(){
MovieTask movieTask = new MovieTask(myView, this);
movieTask.doInBackground(null);
}

}

MovieTask 是一个 Asynctask,它会定期刷新 View 。但是 invalidate() 不会刷新 View 。

public class MovieTask extends AsyncTask<String, String, String> {

MyView drawingView;
MainActivity mainActivity;

public MovieTask(MyView view, MainActivity mainActivity){
this.mainActivity = mainActivity;
this.drawingView =view;
}

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

for(int i=20;i<100;i++){
drawingView.myBall.goTo(i,i);
publishProgress();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

return null;
}

@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.v("DEBUG_DRAW","in onProgressUpdate()");
drawingView.invalidate();
}
});

}

}

有人可以帮忙吗?

最佳答案

查看您如何启动 AsyncTask:


public void startMovie() {
MovieTask movieTask = new MovieTask(myView, this);
movieTask.doInBackground(null);
}

您在某个名为 MovieTask 的类中手动调用方法,因此您在同一个线程上运行代码。显然,这不是您的 Intent ,您打算在后台线程上运行计算代码。

启动 AsyncTask 的正确方法是使用 execute(Params...) :


public void startMovie() {
MovieTask movieTask = new MovieTask(myView, this);
movieTask.execute("");
}

现在您将获得所需的效果。


附言

请不要使用该代码:您不需要启动后台线程来执行此类操作。作为替代方案,请考虑 Animators API .

MyBall 类中声明 setBall(int pos) 方法:


public class MyView extends View {
...
public void setBall(int pos) {
myBall.setX(pos);
myBall.setY(pos);
invalidate();
}
}

然后将 startMovie() 更改为以下内容:


public void startMovie() {
// "ball" means, that Animators API will search for `public setBall(int)` method inside MyView.java and call that method
ObjectAnimator ball = ObjectAnimator.ofInt(myView, "ball", 20, 100);
ball.setDuration(1000);
ball.start();
}

您将获得相同的动画,而无需讨厌的代码。

关于java - 异步任务 : invalidating view does not take effect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49316619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com