如何在两个不同的类中使用相同的计数器

时间:2016-02-23 09:23:18

标签: java android class variables android-fragments

我正在创建一个登录片段,用户最多可以尝试3次登录。

要这样做,我想在fragment中使用一个计数器,但鉴于此片段还包含用于连接到Internet的asynctask class,它还需要使用计数器变量。

我知道我可以与SharedPreferences合作,但我想知道是否有更好的方法。

代码如下:

public class loginfragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //CONNECT TO INTERNET!!
                task=new PasswordCheckTask();
                task.execute();
                //END CONNECT TO INTERNET!!
            }
        });
   }

   class PasswordCheckTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPostExecute(Void result) {

            if (success == "1"){
                 Intent xx = new Intent(getContext().getApplicationContext(), ArduinoFirst.class);
                 xx.putExtra("position", position);
                 startActivity(xx);
                 counter=3; //Counter goes back to 3
            } else if (counter!=0) {
                 counter=counter-1 //One less try
            }
       }
 }

你会怎么做?

3 个答案:

答案 0 :(得分:1)

你可以使用静态变量,它可以在任何地方工作

答案 1 :(得分:1)

在您的示例中,PasswordCheckTask类是loginfragment的子类(顺便说一句,惯例是将其命名为LoginFragment)。因此,您可以在技术上定义counter的变量LoginFragment,并且两者都可以访问它。

但是,请注意您在这里处理线程,因此您应该使用AtomicInteger之类的内容或使用synchronized关键字对其进行包装。

示例:

public class LoginFragment extends Fragment {

    private AtomicInteger counter = new AtomicInteger();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //CONNECT TO INTERNET!!
                task=new PasswordCheckTask();
                task.execute();
                //END CONNECT TO INTERNET!!
            }
        });
   }

   class PasswordCheckTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPostExecute(Void result) {

            if (success == "1"){
                 Intent xx = new Intent(getContext().getApplicationContext(), ArduinoFirst.class);
                 xx.putExtra("position", position);
                 startActivity(xx);
                 counter.set(3);
            } else if (counter.get() != 0) {
                 counter.getAndDecrement();
            }
       }
 }

但是,我只看到你使用子类PasswordCheckTask中的计数器,所以你可以在其中定义它,除非我错过了什么。

答案 2 :(得分:0)

您可以创建一个Utils类,并在其中定义一个public static int变量,您可以从代码中的任何位置访问该变量。