Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使在完成后也会显示Toast();_Java_Android_Android Lifecycle_Toast_Activity Lifecycle - Fatal编程技术网

Java 即使在完成后也会显示Toast();

Java 即使在完成后也会显示Toast();,java,android,android-lifecycle,toast,activity-lifecycle,Java,Android,Android Lifecycle,Toast,Activity Lifecycle,我是android新手,我在这里发现了类似的问题,但没有一个能解决我的问题。下面的代码基本上是从Firebase获取两个双值(纬度和经度),并将它们绘制在地图上。当用户注销时,即从数据库中删除双值时,会显示一个toast。这里的问题是,即使在我回到其他活动之后,也会显示这一祝酒词。我怎样才能阻止这一切。我只想在我完成的地方结束活动 任何帮助都将不胜感激。提前谢谢 编辑:如果我打开此活动的多个实例(查看许多人的位置),我将在每个人注销时获得每个实例的祝酒词。我担心这会浪费很多资源 可能是因为get

我是android新手,我在这里发现了类似的问题,但没有一个能解决我的问题。下面的代码基本上是从Firebase获取两个双值(纬度和经度),并将它们绘制在地图上。当用户注销时,即从数据库中删除双值时,会显示一个toast。这里的问题是,即使在我回到其他活动之后,也会显示这一祝酒词。我怎样才能阻止这一切。我只想在我完成的地方结束活动

任何帮助都将不胜感激。提前谢谢

编辑:如果我打开此活动的多个实例(查看许多人的位置),我将在每个人注销时获得每个实例的祝酒词。我担心这会浪费很多资源

可能是因为getMapAsync?已读到异步任务在不同的线程上运行,即使在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>

在onDestroy()方法中添加finish after


您的问题是,当您移动到另一个活动时,侦听器未被删除,除非您按了后退键

你应该把

myRef.removeEventListener(侦听)

进入onPause/onStop方法。
由于您的toast仍处于活动状态,并且对孩子的任何更改都将触发toast。

toast将在与
toast相对应的持续时间内显示。LENGTH\u SHORT
的持续时间为3.5秒,根据,无论呼叫活动是否处于活动状态。我认为您想要的是显示用户已注销的祝酒词。等待屏幕上显示它。显示完成后,立即销毁活动。这可以通过调用show toast,等待3.5秒,然后销毁活动来实现。 所以,如上所述,

可能有用

或者,如果您想等待3.5秒或与
Toast.LENGTH\u LONG
相对应的时间以外的时间,请遵循以下步骤

编辑: 对不起,我误解了你的问题


我认为问题可能是我们不能将侦听器从它自己的方法中分离出来。我想把
myRef.removeEventListener(listen)可能会有所帮助。

您可以使用ActivityName.this.finish()

请先取消祝酒,然后再呼叫finish

   final Toast testing = Toast.makeText(context, "start.", Toast.LENGTH_SHORT);
    testing.show();
当你调用finish时使用这个

testing.cancel(); 
 finish();


无论活动是否已关闭,toast都将显示,直到未完成执行为止。烤面包片的时间为3秒(排序持续时间)。请确保您在3秒钟后再打电话,或者取消toast并随时呼叫finish

我已更改代码。我贴的那张是不同的活动。搞错了。请共享第一个活动源代码startActivity部分。你是指上一个活动吗?谢谢,但没有纠正问题,即使我使用backpressed,问题仍然存在。你看到的toast是什么?“@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();)“对不起,我问的是您在其他活动中看到的祝酒词,您说这是由此地图活动引起的。您是否将remove listener置于super.onStop上方或super.onPause上方?这有关系吗?既然我使用了removeEventListener,听众是否应该停止聆听?哦,现在我明白您的问题了!(我之前认为即使在销毁活动后,toast仍会持续显示3.5秒。但它似乎再次出现)如果是这种情况,我将更新我的答案。我已将其置于顶部并暂停。没有解决问题。
finish()
调用
onDestroy()
根据。您可以尝试输入
onDestroy()吗
?您有
@Override public void onDestroy(){super.onDestroy();}
,将其替换为
@Override public void onDestroy(){myRef.removeEventListener(listen);super.onDestroy();}
,并将toast变量设为globleTried。但没有更改。输出完全相同。toast.cancel();未影响任何内容。请在3秒钟后使用finish方法使用Handler查看我的答案可能会有帮助您可以使用toast Name.cancel()方法。在onDestroy()方法中。没有。仍然没有更改。请将toast Name.cancel()放在finish并重试之前。您可以在此方法中取消所有toast。是否需要创建自定义视图以取消toast
   final Toast testing = Toast.makeText(context, "start.", Toast.LENGTH_SHORT);
    testing.show();
testing.cancel(); 
 finish();