即使在完成()之后也会显示吐司;

时间:2017-06-24 03:35:45

标签: java android android-lifecycle toast activity-lifecycle

我是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>

5 个答案:

答案 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秒后打电话或取消祝酒并随时致电