从 onPostExecute() 发送值到 Activity 始终为 NULL
Send Value From onPostExecute() to Activity is always NULL
我创建了这个 class:
public class GetAddressPositionTask extends
AsyncTask<String, Integer, LatLng> {
//...
}
它有以下功能:
@Override
public void onPostExecute(LatLng result) {
Log.i("GEOCODE", result.toString());
super.onPostExecute(result);
Intent i = new Intent(this.mainContxt , MapsActivity.class);
i.putExtra("latlng" , result);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
this.mainContxt.startActivity(i);
}
我正在尝试从 onPostExecute 方法向名为 MapsActivity 的 Activity 发送数据。
在地图中Activity 我在 onCreate 之前有这个:
LatLng position = new LatLng(34.6767, 33.04455);
我的onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
if (getIntent() != null) {
Intent intent = getIntent();
if (getIntent().getExtras().getParcelable("latlng")!= null) {
position = getIntent().getExtras().getParcelable("latlng");
}
else {
Log.d("NULL?", "position is empty!");
}
} else {
}
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.
map);
mapFragment.getMapAsync(this);
}
这是我的 onMapReady,它使用我初始化的位置创建了图钉,当您键入地址并按下搜索按钮时,它会调用上面的 class,它具有 onPost 功能并尝试将图钉固定如果位置不为空,则在地图中的位置。
@Override
public void onMapReady(final GoogleMap map) {
map.setMyLocationEnabled(true);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.animateCamera(zoom);
map.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(position))
.setDraggable(true);
// map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
map.setOnMarkerDragListener(this);
ImageButton search = (ImageButton) findViewById(R.id.search);
final EditText searchaddress = (EditText) findViewById(R.id.locationsearch);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//FIND LOCATION BY ADDRESS
if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
new GetAddressPositionTask(getApplicationContext()).execute(searchaddress.getText().toString());
map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.animateCamera(zoom);
//Marker marker = null;
map.clear();
//marker.setPosition(position);
map.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(position))
.setDraggable(true);
// map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(MapsActivity.this);
map.setOnMarkerDragListener(MapsActivity.this);
} else {
Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
}
}
});
}
我做的过程是打开地图Activity,然后输入正确的地址并尝试显示它。
结果是位置没有改变,但我没有进入 logcat 单击按钮后的消息 NULL?﹕ position is empty!
。
这是我第一次导航到地图时的 logcatActivity,然后单击调用 class:
的按钮
02-24 20:55:35.133 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.143 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.143 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.223 5907-5907/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 47 frames! The application may be doing too much work on its main thread.
02-24 20:55:36.775 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_launch_request id:guide_me_for_all.guide_me_for_all time:42579264
02-24 20:55:36.865 5907-5907/guide_me_for_all.guide_me_for_all I/x﹕ Making Creator dynamically
02-24 20:55:37.265 5907-5907/guide_me_for_all.guide_me_for_all I/Google Maps Android API﹕ Google Play services client version: 6587000
02-24 20:55:37.285 5907-5907/guide_me_for_all.guide_me_for_all I/Google Maps Android API﹕ Google Play services package version: 6776034
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.ew.c
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 441: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000f
02-24 20:55:39.117 5907-5907/guide_me_for_all.guide_me_for_all D/NULL?﹕ position is empty!
02-24 20:55:39.377 5907-5907/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 57 frames! The application may be doing too much work on its main thread.
02-24 20:55:39.517 5907-5907/guide_me_for_all.guide_me_for_all I/libblt_hw﹕ Library opened (handle = 0, fd = 100)
02-24 20:55:39.788 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@424fec18 time:42582274
02-24 20:55:41.970 5907-5912/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Jit: resizing JitTable from 4096 to 8192
02-24 20:55:47.946 5907-6133/guide_me_for_all.guide_me_for_all I/GEOCODE_background﹕ lat/lng: (64.963051,-19.020835)
02-24 20:55:47.946 5907-5907/guide_me_for_all.guide_me_for_all I/GEOCODE﹕ lat/lng: (64.963051,-19.020835)
02-24 20:55:47.946 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_launch_request id:guide_me_for_all.guide_me_for_all time:42590434
一些令人困惑的代码和解释,
让我们循序渐进。
第 1 步: 更新地图Activity 的 onCreate()
喜欢,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
此处不需要 Intent,因为您只在同一个 MapsActivity
中调用 MapsActivity
。我们将在 Activity 的 onPostExecute()
中更新地图,然后无需重新开始 Activity。
第 2 步: 使用 GoogleMap map
参数为 GetAddressPositionTask
创建构造函数以更新您在 onPostExecute()
of GetAddressPositionTask
中的地图位置.并且 onPostExecute()
喜欢,
public class GetAddressPositionTask extends
AsyncTask<String, Integer, LatLng> {
GoogleMap googleMap;
LatLng mapPosition;
GetAddressPositionTask(GoogleMap map, LatLng position)
{
googleMap = map;
mapPosition = position;
}
//...
@Override
public void onPostExecute(LatLng result) {
if(result != null)
{
Log.i("GEOCODE", result.toString());
mapPosition = result;
googleMap.clear();
googleMap.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(mapPosition))
.setDraggable(true);
}
}
}
第 3 步:搜索按钮 onClick()
的外观,无需额外代码,
public void onClick(View v) {
//FIND LOCATION BY ADDRESS
if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
GetAddressPositionTask addressTask = new GetAddressPositionTask(map, position);
addressTask.execute(searchaddress.getText().toString());
} else {
Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
}
}
我创建了这个 class:
public class GetAddressPositionTask extends
AsyncTask<String, Integer, LatLng> {
//...
}
它有以下功能:
@Override
public void onPostExecute(LatLng result) {
Log.i("GEOCODE", result.toString());
super.onPostExecute(result);
Intent i = new Intent(this.mainContxt , MapsActivity.class);
i.putExtra("latlng" , result);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
this.mainContxt.startActivity(i);
}
我正在尝试从 onPostExecute 方法向名为 MapsActivity 的 Activity 发送数据。
在地图中Activity 我在 onCreate 之前有这个:
LatLng position = new LatLng(34.6767, 33.04455);
我的onCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
if (getIntent() != null) {
Intent intent = getIntent();
if (getIntent().getExtras().getParcelable("latlng")!= null) {
position = getIntent().getExtras().getParcelable("latlng");
}
else {
Log.d("NULL?", "position is empty!");
}
} else {
}
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.
map);
mapFragment.getMapAsync(this);
}
这是我的 onMapReady,它使用我初始化的位置创建了图钉,当您键入地址并按下搜索按钮时,它会调用上面的 class,它具有 onPost 功能并尝试将图钉固定如果位置不为空,则在地图中的位置。
@Override
public void onMapReady(final GoogleMap map) {
map.setMyLocationEnabled(true);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.animateCamera(zoom);
map.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(position))
.setDraggable(true);
// map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
map.setOnMarkerDragListener(this);
ImageButton search = (ImageButton) findViewById(R.id.search);
final EditText searchaddress = (EditText) findViewById(R.id.locationsearch);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//FIND LOCATION BY ADDRESS
if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
new GetAddressPositionTask(getApplicationContext()).execute(searchaddress.getText().toString());
map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
map.animateCamera(zoom);
//Marker marker = null;
map.clear();
//marker.setPosition(position);
map.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(position))
.setDraggable(true);
// map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(MapsActivity.this);
map.setOnMarkerDragListener(MapsActivity.this);
} else {
Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
}
}
});
}
我做的过程是打开地图Activity,然后输入正确的地址并尝试显示它。
结果是位置没有改变,但我没有进入 logcat 单击按钮后的消息 NULL?﹕ position is empty!
。
这是我第一次导航到地图时的 logcatActivity,然后单击调用 class:
的按钮02-24 20:55:35.133 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.143 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.143 5907-5907/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 20:55:35.223 5907-5907/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 47 frames! The application may be doing too much work on its main thread.
02-24 20:55:36.775 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_launch_request id:guide_me_for_all.guide_me_for_all time:42579264
02-24 20:55:36.865 5907-5907/guide_me_for_all.guide_me_for_all I/x﹕ Making Creator dynamically
02-24 20:55:37.265 5907-5907/guide_me_for_all.guide_me_for_all I/Google Maps Android API﹕ Google Play services client version: 6587000
02-24 20:55:37.285 5907-5907/guide_me_for_all.guide_me_for_all I/Google Maps Android API﹕ Google Play services package version: 6776034
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.ew.c
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 441: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;
02-24 20:55:38.406 5907-5907/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000f
02-24 20:55:39.117 5907-5907/guide_me_for_all.guide_me_for_all D/NULL?﹕ position is empty!
02-24 20:55:39.377 5907-5907/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 57 frames! The application may be doing too much work on its main thread.
02-24 20:55:39.517 5907-5907/guide_me_for_all.guide_me_for_all I/libblt_hw﹕ Library opened (handle = 0, fd = 100)
02-24 20:55:39.788 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@424fec18 time:42582274
02-24 20:55:41.970 5907-5912/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Jit: resizing JitTable from 4096 to 8192
02-24 20:55:47.946 5907-6133/guide_me_for_all.guide_me_for_all I/GEOCODE_background﹕ lat/lng: (64.963051,-19.020835)
02-24 20:55:47.946 5907-5907/guide_me_for_all.guide_me_for_all I/GEOCODE﹕ lat/lng: (64.963051,-19.020835)
02-24 20:55:47.946 5907-5907/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_launch_request id:guide_me_for_all.guide_me_for_all time:42590434
一些令人困惑的代码和解释,
让我们循序渐进。
第 1 步: 更新地图Activity 的 onCreate()
喜欢,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
MapFragment mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
此处不需要 Intent,因为您只在同一个 MapsActivity
中调用 MapsActivity
。我们将在 Activity 的 onPostExecute()
中更新地图,然后无需重新开始 Activity。
第 2 步: 使用 GoogleMap map
参数为 GetAddressPositionTask
创建构造函数以更新您在 onPostExecute()
of GetAddressPositionTask
中的地图位置.并且 onPostExecute()
喜欢,
public class GetAddressPositionTask extends
AsyncTask<String, Integer, LatLng> {
GoogleMap googleMap;
LatLng mapPosition;
GetAddressPositionTask(GoogleMap map, LatLng position)
{
googleMap = map;
mapPosition = position;
}
//...
@Override
public void onPostExecute(LatLng result) {
if(result != null)
{
Log.i("GEOCODE", result.toString());
mapPosition = result;
googleMap.clear();
googleMap.addMarker(new MarkerOptions()
.title("Shop")
.snippet("Is this the right location?")
.position(mapPosition))
.setDraggable(true);
}
}
}
第 3 步:搜索按钮 onClick()
的外观,无需额外代码,
public void onClick(View v) {
//FIND LOCATION BY ADDRESS
if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
GetAddressPositionTask addressTask = new GetAddressPositionTask(map, position);
addressTask.execute(searchaddress.getText().toString());
} else {
Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
}
}