传递在两个活动之间不断更新的数据

时间:2016-10-05 19:04:22

标签: java android

我有两个活动,我的MainActivity运行TimerTask,递增"计数器"值。

public class MainActivity extends AppCompatActivity {

    public static int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Handler handler = new Handler();

        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        counter++;
                    }
                });
            }
        };

        timer.schedule(timerTask, 0, 1000);

        Intent intent = new Intent(this, MapActivity.class);
        startActivity(intent);
    }
}

我的MapActivity应该在按下按钮时读取此值。

public class MapActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
    }

    public void readCounter(View view){
        Log.d("counter:", Integer.toString(MainActivity.counter));
    }
}

目前,计数器被声明为公共静态变量,但由于静态变量是不好的做法,那么做什么是正确而优雅的方法呢?

2 个答案:

答案 0 :(得分:1)

Bundles用于添加额外的参数以传递给被调用的活动。因此,您可以根据需要获取并使用此额外参数。

以下是如何操作:

MainActivity中的

Intent intent = new Intent(this, MapActivity.class);
intent.putExtra("counter", counter);  
startActivity(intent);
MapActivity中的

Bundle extras = getIntent().getExtras(); 
int counter = extras.getIntExtra("counter");

编辑1 :对于持续更新,请使用自定义侦听器界面

public class MainActivity extends AppCompatActivity {

    public static int counter = 0;
    private MyCounterUtil util;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Handler handler = new Handler();

        util = MyCounterUtil.getInstance();


        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        counter++;
                        util.notifyUpdate(counter);
                    }
                });
            }
        };

        timer.schedule(timerTask, 0, 1000);

        Intent intent = new Intent(this, MapActivity.class);
        startActivity(intent);
    }

}

创建此类

public class MyCounterUtil {

private static MyCounterUtil mInstance;
private MyCounterListener mListener;

private MyCounterUtil() {}

public static MyCounterUtil getInstance() {
        if(mInstance == null) {
            mInstance = new MyCounterUtil();
        }
        return mInstance;
    }


 public void setListener(MyCounterListener listener) {
        mListener = listener;
    }

private void notifyUpdate(int count) {
    if(mListener != null)
        mListener.onUpdate(count);
    }

public interface MyCounterListener{

      public void onUpdate(int count);

  }
}

在MapActivity中实现侦听器接口

public class MapActivity extends AppCompatActivity implements MyCounterListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        MyCounterUtil.getInstance().setListener(this);
    }
/*
    public void readCounter(View view){
        Log.d("counter:", Integer.toString(MainActivity.counter));
    }
*/
    @Override
    public void onUpdate(int count){
       Log.d("counter:", Integer.toString(count));
    }

}

编辑2: 没有TimerTask的另一种干净而简单的方法是使用系统时间作为计数器,并使用intent或sharedpreferences传递其第一个值。

MainActivity中的

public class MainActivity extends AppCompatActivity {


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

/*
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putLong("startTime", System.currentTimeMillis());
            editor.apply();
      */

            Intent intent = new Intent(this, MapActivity.class);
            intent.putExtra("startTime", System.currentTimeMillis()); 
            startActivity(intent);
        }

    }
MapActivity中的

public class MapActivity extends AppCompatActivity {

    private long startTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        /* in case use of sharedpref        
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        startTime = preferences.getLong("startTime", 0);
        */

        //in case use of bundle
        startTime = getIntent().getExtras().getLongExtra("startTime", 0);

    }

    public void readCounter(View view){
        long counter = (System.currentTimeMillis() - startTime)/1000;
        Log.d("counter:", "" + counter);
    }

}

答案 1 :(得分:1)

静态值没有任何问题。如果你想使它成为MVC并使用模型,你可能应该用Singleton Model类包装这个值。

但为了简化问题,我建议您确保重置MainActivity onCreate上的值。

这样做的方法是使用服务或startActivityForResult