在我的 UI 上,我有一个ImageView
(箭头图像)需要实时更新。
箭头有 2 种可能的移动方式:
- 旋转始终指向北方
- 当用户的位置改变时移动
我已经让这两种方法正常运行。
唯一的问题是我的UI 很慢,有时会卡住。同时,我的手机在运行应用程序时总是变得非常热。Logcat
有时也告诉我
跳过*帧。应用程序可能在其主线程上做了太多工作。
我被告知要使用AsyncTask
,以免给我的 UI 带来压力。所以我在AsyncTask
. 但是,问题仍然存在。我的用户界面仍然很慢。
AsyncTask
我想我的实现应该有问题。我将它们粘贴在这里,如下所示:
public class ArrowheadUpdater extends AsyncTask<Float, Integer, Float> { // Float: azimuth, Integer: state
private ImageView arrowheadToRotate;
private float rotationAngle; // also in radians
// constructor
public ArrowheadUpdater(ImageView _arrowheadToRotate) {
arrowheadToRotate = _arrowheadToRotate;
rotationAngle = -1;
}
protected void onPreExecute(Float _azimuth) {
super.onPreExecute();
}
@Override
// executed first to get the angle to rotate
protected Float doInBackground(Float... arg0) {
rotationAngle = (float) (Constant.MAP_ORIENTATION_OFFSET + arg0[0]);
return rotationAngle;
}
protected void onProgressUpdated(Integer... progress) {
super.onProgressUpdate(progress);
}
protected void onPostExecute(Float result) {
super.onPostExecute(result);
\\ rotation happens here
rotateImageView(ShowPathActivity.this, arrowheadToRotate, R.drawable.marker, result);
\\ moving happens here
movaImageView(arrowhead, MapView.historyXSeries, MapView.historyYSeries);
}
我这样调用 AsyncTask:
// called when sensor values change
public void onSensorChanged(SensorEvent event) { // is roughly called 350 times in 1s
//...
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
compassChangedTimes++;
magneticField[0] = event.values[0];
magneticField[1] = event.values[1];
magneticField[2] = event.values[2];
SensorManager.getRotationMatrix(RotationM, I, gravity, magneticField);
SensorManager.getOrientation(RotationM, direction);
if (compassChangedTimes % 50 == 0) {
// HERE!!!!!!!!!!
new ArrowheadUpdater(arrowhead).execute(direction[0]);
}
}
if (startFlag)
dataCollector.saveDataShowPath(acceleration, magneticField, startTime, currentTime);
}
我应该把 2 个箭头更新方法doInBackground()
代替onPostExecute()
吗?
但是 doInBackground() 中的行可以更新 UI 吗?我不确定。
我的有什么问题AsyncTask
吗?
欢迎其他猜测或评论!
更多线索:
我只是注意到,当我刚刚进入这个活动时,用户界面非常慢并且卡住了很多。但过了一段时间,比如 10 秒,它有点变得可以接受的平滑。