并发访问静态方法

时间:2018-02-22 16:59:56

标签: java android

我有一个包含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) {

        }
    });


 }

}

1 个答案:

答案 0 :(得分:0)

如果每个侦听器需要单独的计时器和进度,为什么要使用静态变量? (waitTimer,diff,i)。问题是ArcProgress的两个实例都在更新相同的值,而非并发性是设计。更改您的变量以使其仅为私有,并且您将获得不同的结果。