The user interface is updated when my application loses focus and regains focus. Weird question

I want to update my textView in aynctask, but it does not update at all. I can’t find out my mistake.

Here is my code:

NOTE. - The user interface is updated when my application loses focus and regains focus. Strange problem

public class LocateGeopoint extends AsyncTask<LatLng, String, List<Address>> { Geocoder geocoder; private TextView tv; public LocateGeopoint(View v) { this.geocoder = new Geocoder(v.getContext()); this.tv = (TextView) v.findViewById(R.id.textView1); } @Override protected void onPostExecute(List<Address> addresses) { super.onPostExecute(addresses); if(addresses!=null){ String city = addresses.get(0).getAddressLine(0); String country = addresses.get(0).getAddressLine(1); System.out.println(city+" "+country); tv.setText(city); } } @Override protected List<Address> doInBackground(LatLng... params) { // TODO Auto-generated method stub double lattitude = params[0].latitude; double longitude = params[0].longitude; List<Address> addresses = null; if (lattitude != 0 || longitude != 0) { try { addresses = geocoder.getFromLocation(lattitude, longitude, 1); } catch (IOException e) { e.printStackTrace(); } } return addresses; } } 

XML file (inflated)

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/parent_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <FrameLayout android:id="@+id/view_container" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="true" android:text="Loading Address.." /> </FrameLayout> 

This is how I call Asyntask from the main action

 googleMap.setInfoWindowAdapter(new InfoWindowAdapter() { @Override public View getInfoWindow(Marker arg0) { return null; } @SuppressWarnings("unchecked") @Override public View getInfoContents(Marker marker) { LayoutInflater inflater = (LayoutInflater) MapsDemo.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.custom_info, null); new LocateGeopoint(v).execute(marker.getPosition()); return v; } }); 

When I debug the application, it is updated, but usually it is not.

+4
source share
4 answers

Add a cache to your InfoWindowAdapter code and change its getInfoContents() method to check it:

  googleMap.setInfoWindowAdapter(new InfoWindowAdapter() { LruCache<Marker, View> cache = new LruCache<Marker, View>(8); // added // no change to getInfoWindow() @SuppressWarnings("unchecked") @Override public View getInfoContents(Marker marker) { View v = cache.get(marker); if (v == null) { LayoutInflater inflater = (LayoutInflater) MapsDemo.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.custom_info, null); new LocateGeopoint(v, marker).execute(marker.getPosition()); cache.put(marker, v); } return v; } }); 

Adjust the code in the LocateGeopoint class by adding a reference to Marker and calling showInfoWindow() after updating TextView.

 public class LocateGeopoint extends AsyncTask<LatLng, String, List<Address>> { // : Marker marker; // added public LocateGeopoint(View v, Marker marker) { // : this.marker = marker; // added } @Override protected void onPostExecute(List<Address> addresses) { super.onPostExecute(addresses); if(addresses!=null){ // : tv.setText(city); marker.showInfoWindow(); // added } } // no change to doInBackground() } 

NOTE. This answer is actually just a quick and dirty implementation (I have not tested it, but I think that it should work) based on the answer from MaciejGórski on this question, please read the link provided in this answer for more details :)

+3
source

You can try calling tv.invalidate () hope it will work

if it does not work

try to make a variable outside the onCreate text, for example TextView; and then inside onCreate put: text = (TextView) findViewById (R.id.textView2);

and then just put text.setText (city); inside the onPostExecute method.

See if this works.

+2
source

As stated in the documentation , the returned view is not a living view and cannot be updated after returning from getInfoContents.

Try the following answer: Dynamic content in Maps V2 InfoWindow

+1
source

Try the following:

 runOnUiThread(new Runnable() { public void run() { try { Thread.sleep(25); } catch (InterruptedException e) { e.printStackTrace(); } tv.setText(city); } }); 

Upon closer inspection of your code:

 @Override protected void onPostExecute(List<Address> addresses) { super.onPostExecute(addresses); if(addresses!=null){ String city = addresses.get(0).getAddressLine(0); String country = addresses.get(0).getAddressLine(1); System.out.println(city+" "+country); tv.setText(city); } } 

You have surpassed the onPostExecute() method, why is it called a superfunction? Remove super.onPostExecute(addresses); .

+1
source

All Articles