我有一个包含2个ArcProgress的活动,它们都从Firebase的单独子节点获取数据,所以我在单独的Class中创建了一个静态方法,它改变了Arcs的值,然后在firebase的onDataChange方法上调用它。弧显示错误值的问题,我认为这是由对该类的并发访问引起的。 我尝试添加同步,但这并没有解决问题。
这是包含方法
的类public class ArcProgSettings {
private static int diff=0;
private static int i;
private static CountDownTimer waitTimer;
private int previousTemp=0;
private int newT=0;
private ArcProgress arcTemp;
public ArcProgSettings(){
}
public ArcProgSettings(int previousTemp, int newT, final ArcProgress
arcTemp){
this.previousTemp=previousTemp;
this.newT=newT;
this.arcTemp=arcTemp;
}
public synchronized void setProg() {
diff = newT - previousTemp;
i = previousTemp;
if (diff >= 0) {
waitTimer = new CountDownTimer((diff + 2) * 100, 100) {
public void onTick(long millisUntilFinished) {
//called every 300 milliseconds, which could be used to
//send messages or some other action
arcTemp.setProgress(i);
i++;
}
public void onFinish() {
//After 60000 milliseconds (60 sec) finish current
//if you would like to execute something when time
finishes
}
}.start();
} else {
waitTimer = new CountDownTimer(-(diff - 2) * 100, 100) {
public void onTick(long millisUntilFinished) {
arcTemp.setProgress(i);
i--;
}
public void onFinish() {
}
}.start();
}
}
}
这是包含调用的Activity:(setProg)
public class VisualisationActivity extends AppCompatActivity {
private ArcProgress arcTemp;
private DatabaseReference mTempDatabase;
private String MyTemp="0";
int previousTemp=0;
private ArcProgress arcCurrent;
private DatabaseReference mCurrentDatabase;
private String MyCurrent="0";
int previousCurrent=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visualisation);
arcTemp=(ArcProgress)findViewById(R.id.arc_prog_temp);
mTempDatabase =
FirebaseDatabase.getInstance().getReference().child("temp");
mTempDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
MyTemp =(dataSnapshot.child("value").getValue().toString());
final int newT= Integer.parseInt(MyTemp);
ArcProgSettings arc=new ArcProgSettings(previousTemp,
newT,arcTemp);
arc.setProg();
previousTemp=newT;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
arcCurrent=(ArcProgress)findViewById(R.id.arc_progress_current);
mCurrentDatabase =
FirebaseDatabase.getInstance().getReference().child("current");
mCurrentDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
MyCurrent =(dataSnapshot.child("value").getValue().toString());
final int newC= Integer.parseInt(MyCurrent);
ArcProgSettings arc1=new ArcProgSettings(previousCurrent,
newC,arcCurrent);
arc1.setProg();
previousCurrent=newC;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
答案 0 :(得分:0)
如果每个侦听器需要单独的计时器和进度,为什么要使用静态变量? (waitTimer,diff,i)。问题是ArcProgress的两个实例都在更新相同的值,而非并发性是设计。更改您的变量以使其仅为私有,并且您将获得不同的结果。