如何在启动另一个活动时保存变量值

时间:2016-10-14 23:13:03

标签: android android-activity savestate

我在应用程序中的一项活动(活动A)显示了一个视频列表,如图所示:

enter image description here 视频存储在名为videosList的ArrayList中,当用户选择视频时,使用另一活动B中的嵌入式YouTube播放器播放视频。 问题是当用户从活动B(使用视频播放器的活动)回到活动A(带有视频列表的活动)时,变量videosList为空,因此应用程序停止运行并出现错误。

我试图实现

protected void onSaveInstanceState(Bundle savedInstanceState) protected void onRestoreInstanceState(Bundle savedInstanceState)方法保存活动状态和一些变量,因此当用户返回活动A时,应用程序可以再次显示视频列表,但是当我尝试gat时我之前保存在onSaveInstanceState(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) savedInstanceState public class VideosCatalogActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { private Toolbar toolbar; private GridView videosGrid; private ArrayList<VideoEntity> videosList; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private FirebaseDatabase database; @Override public void onCreate(Bundle savedInstanceState) { Log.d(TAG, " onCreate(Bundle) - Ini "); super.onCreate(savedInstanceState); // onSaveInstanceState(); setContentView(R.layout.videos_catalog_layout); toolbar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(toolbar); toolbar.setTitle(R.string.app_name); toolbar.setTitleTextColor(getResources().getColor(R.color.com_facebook_button_background_color_focused)); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = mAuth.getCurrentUser(); } }; database = FirebaseDatabase.getInstance(); Bundle bundle = getIntent().getExtras(); String actividad = bundle.getString("Activity"); if (actividad.equals("DocumentariesCategoriesActivity")) { videosList = bundle.getParcelableArrayList("com.app.example.VideoEntity"); updateCatalog(); /* String videoId = ""; if (!videosList.isEmpty() && !videosList.equals(null)) { for (VideoEntity video : videosList) { DatabaseReference mRef = database.getReference().child("Videos").child(video.getId()); mRef.setValue(video); } videosGrid = (GridView) findViewById(R.id.videosGrid); MyGridViewAdapter adapter = new MyGridViewAdapter(this); adapter.setVideosList(videosList); videosGrid.setAdapter(adapter); videosGrid.setOnItemClickListener(this); } */ } Log.d(TAG, " onCreate(Bundle) - Fi "); } @Override public boolean onCreateOptionsMenu(Menu menu) { Log.d(TAG, "onCreateOptionsMenu(Menu) - Ini"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); Log.d(TAG, "onCreateOptionsMenu(Menu) - Fi"); return true; } @Override public boolean onOptionsItemSelected(MenuItem menuItem) { Log.d(TAG, "onOptionItemSelected(MenuItem) - Ini"); switch (menuItem.getItemId()) { case R.id.action_logout: updateActivity(mAuth.getCurrentUser()); } Log.d(TAG, "onOptionItemSelected(MenuItem) - Fi"); return true; } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Ini "); Intent intent = new Intent(getApplicationContext(), YoutubePlayerActivity.class); intent.putExtra("VIDEO_ID", videosList.get(position).getId()); startActivity(intent); Log.d(TAG, " onItemClick(AdapterView<?>, View, int, long) - Fi "); } protected void updateActivity(FirebaseUser user) { Log.d(TAG, "updateActivity(FirebaseUser) - Ini"); mAuth.signOut(); Intent i = new Intent(VideosCatalogActivity.this, LoginActivity.class); startActivity(i); Log.d(TAG, "updateActivity(FirebaseUser) - Fi"); } @Override protected void onSaveInstanceState(Bundle savedInstanceState) { Log.d(TAG, "onSaveInstanceState(Bundle) - Ini"); super.onSaveInstanceState(savedInstanceState); savedInstanceState.putParcelableArrayList("VIDEOS_LIST", videosList); savedInstanceState.putAll(savedInstanceState); Log.d(TAG, "onSaveInstanceState(Bundle) - Fi"); Log.i("","onSaveInstance is executed"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.d(TAG, "onRestoreInstanceState(Bundle) - Ini"); super.onRestoreInstanceState(savedInstanceState); videosList = savedInstanceState.getParcelableArrayList("VIDEOS_LIST"); updateCatalog(); Log.i("","onRestoreInstance is executed"); Log.d(TAG, "onRestoreInstanceState(Bundle) - Fi"); } protected void updateCatalog() { Log.d(TAG, "updateCatalog() - Ini"); String videoId = ""; for (VideoEntity video : videosList) { DatabaseReference mRef = database.getReference().child("Videos").child(video.getId()); mRef.setValue(video); } videosGrid = (GridView) findViewById(R.id.videosGrid); MyGridViewAdapter adapter = new MyGridViewAdapter(this); adapter.setVideosList(videosList); videosGrid.setAdapter(adapter); videosGrid.setOnItemClickListener(this); Log.d(TAG, "updateCatalog() - Fi"); } } 中的值始终为NULL。

这是我的代码:

complex float a __attribute__ ((aligned (16))) = 5 + 10*I;
__m128 f = _mm_load_ps((float const *)&a); // requires 16B alignment
float *p = (float *)&f;
printf("real(0): %f, imag(1): %f, (2): %f, (3): %f\n", p[0], p[1], p[2], p[3]);

请知道我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

为什么不使用SingletonData类?存储ArrayList,当你需要重新加载ArrayList时,你从Singleton加载它。

public class DataSingleton {

    private static DataSingleton instance = new DataSingleton();
    private DataSingleton(){    }

    public static DataSingleton getInstance(){  return instance;    }
    public static void setIntances(DataSingleton instance){DataSingleton.instance = instance;}

    private ArrayList<Videos> videosList;


    public void setArrayVideos(ArrayList<Videos> videos){
        videosList=videos;
    }

    public ArrayList<Videos> getArrayVideos(){
        return videosList;
    }
}

然后在活动A中调用该类,并在任何地方设置ArrayList。

DataSingleton.getInstance().setArrayVideos(videosList);   
videosList= DataSingleton.getInstance().getArrayVideos();

答案 1 :(得分:0)

你的onSaveInstanceState实现必须像这样

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    Log.d(TAG, "onSaveInstanceState(Bundle) - Ini");
    if(savedInstanceState == null)
    {
        savedInstanceState = new Bundle();
    }        
    savedInstanceState.putParcelableArrayList("VIDEOS_LIST", videosList);

    Log.d(TAG, "onSaveInstanceState(Bundle) - Fi");
    Log.i("","onSaveInstance is executed");

    super.onSaveInstanceState(savedInstanceState);
}