每次通过startActivity访问视图时运行OnChildaded方法的Android
我想知道为什么每次我通过启动活动访问视图时,我的android应用程序都会运行fireBase OnChildaded。我只想从fireBase数据库读取一次,从那时起,我使用onResume用数据库中的最后一个条目(如果添加了任何条目)填充列表 但是,每次我使用StartActivity访问视图时,它都会运行OnChildaded。这意味着当我按下后退按钮进入这个视图时,它不会发生 每次用户从主屏幕返回此页面时,都必须从数据库中重新填充列表,这会大大降低我的应用程序的速度 下面是一个视频,演示了当我按back键进入屏幕时,与从主屏幕进入屏幕并按下“夜总会”卡相比,它的速度快了多少: 我的onCreate方法:每次通过startActivity访问视图时运行OnChildaded方法的Android,android,Android,我想知道为什么每次我通过启动活动访问视图时,我的android应用程序都会运行fireBase OnChildaded。我只想从fireBase数据库读取一次,从那时起,我使用onResume用数据库中的最后一个条目(如果添加了任何条目)填充列表 但是,每次我使用StartActivity访问视图时,它都会运行OnChildaded。这意味着当我按下后退按钮进入这个视图时,它不会发生 每次用户从主屏幕返回此页面时,都必须从数据库中重新填充列表,这会大大降低我的应用程序的速度 下面是一个视频,演示
@Override
protected void onCreate(Bundle savedInstanceState) {
// start tracing to "/sdcard/calc.trace"
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nightclub_search);
// Map and camera Positions
// Retrieve location and camera position from saved instance state.
if (savedInstanceState != null) {
mLastKnownLocation = savedInstanceState.getParcelable(KEY_LOCATION);
mCameraPosition = savedInstanceState.getParcelable(KEY_CAMERA_POSITION);
}
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
// Build the Play services client for use by the Fused Location Provider and the Places API.
// Use the addApi() method to request the Google Places API and the Fused Location Provider.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */,
this /* OnConnectionFailedListener */)
.addConnectionCallbacks(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
// List View
listView = (ListView) findViewById(R.id.venueList);
listView.setOnItemClickListener(this);
venueList = new ArrayList<>();
arrayAdapter = new ArrayAdapter<>(nightclub_search.this, R.layout.list_layout, venueList);
// Fill the list view from the fireBase
fillListView();
// Button
Button addClub = (Button) findViewById(R.id.addClub);
addClub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(nightclub_search.this, venue_add.class);
startActivity(i);
}
});
}
最后,这是我从firebase填充列表的方式,该列表在onCreate中调用(其他任何地方都不调用):
尝试在活动的清单中设置启动模式“singleTask”,以便在初始化活动时只调用onCreate一次,并且在所有调用之后都将调用“onNewIntent”方法,直到在活动后堆栈中未创建新实例。启动活动(意图)方法创建一个新的活动实例,除非您为其设置了一些标志。要通过意图恢复现有活动实例,请尝试使用以下方法:
Intent i = new Intent(nightclub_search.this, venue_add.class);
i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
或者将其添加到清单上的活动标记中:
<activity
android:name="com.company.ActivityName"
android:launchMode="singleTask">
</activity>
不幸的是,当从主屏幕进入视图时,它仍然会完全重建列表。我认为这与数据库引用侦听器有关。onCreate中的其他内容没有激活(如加载对话框),因此每次从“开始活动”输入onchildaded时,它必须只是从我的引用侦听器调用onchildaded。我将更新问题以反映这些新发现。感谢您的回复,不幸的是,这两项工作都没有。我认为它不是运行onCreate,而是在每次通过start活动访问视图时(但不是在按返回活动时)调用firebase“onChildaded”。
Intent i = new Intent(nightclub_search.this, venue_add.class);
i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i);
<activity
android:name="com.company.ActivityName"
android:launchMode="singleTask">
</activity>