我是Android的新手,我在这里找到了类似的问题,但没有一个可以解决我的问题。下面的代码基本上是从Firebase获取两个双值(纬度和经度)并在地图上绘制它们。当用户退出时,即从数据库中删除了双值时,会显示一个toast。这里的问题是即使在我回到其他活动之后也会显示这个吐司。我怎么能阻止这个。我只想结束我把完成的活动放在哪里。
任何帮助将不胜感激。提前谢谢!
编辑:如果我打开此活动的许多实例(查看许多人的位置),我会在每个人注销时获得每个实例的祝酒词。我担心这会浪费很多资源。
可能是因为getMapAsync吗?已经读过Async任务在不同的线程上运行,即使在finish()之后也不会停止。
java代码:
package com.example.android.managers;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class LocateS extends Activity implements OnMapReadyCallback {
MapView mapView;
GoogleMap googleMap;
String username;
int firstTime=0;
LocationDetails loc;
ChildEventListener listen = null;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Staff");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locate);
Bundle extras = getIntent().getExtras();
username= extras.getString("user");
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
listen = myRef.child(username).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
loc = dataSnapshot.getValue(LocationDetails.class);
if(loc!=null)
setMap();
else
Toast.makeText(getApplicationContext(),"Location not received yet",Toast.LENGTH_LONG).show();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {
loc = dataSnapshot.getValue(LocationDetails.class);
if(loc!=null)
setMap();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Toast.makeText(getApplicationContext(), username+" logged out", Toast.LENGTH_SHORT).show();
myRef.removeEventListener(listen);
// android.os.Process.killProcess(android.os.Process.myPid());
finish();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
public void setMap(){
if(googleMap!=null){
googleMap.clear();
LatLng coordinate = new LatLng(loc.getLatitude(),loc.getLongitude());
googleMap.addMarker(new MarkerOptions().position(coordinate));
if(firstTime == 0) {
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(coordinate, 17.0f);
googleMap.moveCamera(cameraUpdate);
firstTime++;
}
}
}
@Override
public void onMapReady(GoogleMap map) {
googleMap=map;
map.getUiSettings().setZoomControlsEnabled(true);
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onStop(){
finish();
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onLowMemory() {
mapView.onLowMemory();
super.onLowMemory();
}
@Override
public void onBackPressed() {
myRef.removeEventListener(listen);
finish();
// android.os.Process.killProcess(android.os.Process.myPid());
super.onBackPressed();
}
}
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.android.managers.Locate">
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
/>
</RelativeLayout>
答案 0 :(得分:0)
在onDestroy()方法中添加完成
finish();
答案 1 :(得分:0)
您的问题是当您移动到另一个活动时,除非您按下后再次移除了侦听器。
你应该把
myRef.removeEventListener(听);
进入onPause / onStop方法。 当你的祝酒活着还有孩子的任何变化时,它会触发祝酒。
答案 2 :(得分:0)
根据this,无论呼叫活动是否有效,吐司都会显示与Toast.LENGTH_SHORT
相对应的持续时间,为3.5秒。我想你想要的是展示用户已注销的祝酒词。等到它显示在屏幕上。一旦完成显示,就会破坏活动。这可以通过调用show toast,等待3.5秒然后销毁活动来实现。
所以,正如here所述,
Toast.makeText(getApplicationContext(), username+" logged out", Toast.LENGTH_SHORT).show();
Thread thread = new Thread(){
@Override
public void run() {
try {
Thread.sleep(3500);
LocateS.this.finish();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
可能有用。
或者,如果您要等待3.5秒以外的持续时间或与Toast.LENGTH_LONG
相对应的持续时间,请按this。
修改强> 对不起,我误解了你的问题!
我认为问题可能是我们无法从自己的方法中分离监听器。我认为将myRef.removeEventListener(listen);
放在onDestroy()
中可能会有所帮助。
答案 3 :(得分:0)
您可以使用ActivityName.this.finish();
答案 4 :(得分:0)
在致电
之前取消祝酒testing.cancel();
finish();
并在你呼叫完成时使用它。
{{1}}无论活动是否关闭,
toast都会显示,直到无法完成执行。吐司将持续3秒(排序持续时间)。确保你在3秒后打电话或取消祝酒并随时致电