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