Как обновить маркеры карты на основе результата AsyncTask - PullRequest
1 голос
/ 01 июня 2019

У меня есть asyncTask CommunicationThread, который создает несколько широт и долгот.У меня также есть действие на карте, где я хочу взять результаты CommunicationThread обновить маркер на основе этих результатов.Вот код моей карты Activity.

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private Thread2ThreadInfo connectionInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    connectionInfo = SubscriberActivity.getConnInfo();
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
        Value currentPosition;
        @Override
        public void run() {
            while(true) {
                Log.e("start", "new thread");
                CommunicationThread communicationThread = new CommunicationThread();
                try {
                    currentPosition = communicationThread.execute(connectionInfo).get();
                    Log.e("start", currentPosition.toString());

                    LatLng templt = null;
                    double lat = currentPosition.getLatitude();
                    double lon = currentPosition.getLongtitude();
                    LatLng lt = new LatLng(lat, lon);

                    templt = lt;

                    MarkerOptions a = new MarkerOptions().position(lt).title(currentPosition.getBus().getBusLineId());
                    Marker m = mMap.addMarker(a);
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(lt));
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(templt, 13.0f));
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
}
}

CommunicationThread работает правильно, и данные (позиции) отправляются на карту деятельности.Я использую бесконечный цикл для выполнения CommunicationThread задач, и когда новые позиции доступны, выбирайте их.Я также использую обработчик, чтобы избежать проблем с бесконечным циклом внутри основного потока.Когда я запускаю его, данные отправляются успешно (согласно журналам, созданным в цикле), но карта выглядит следующим образом:

enter image description here

КогдаЯ запускаю его без бесконечного цикла (только для одной позиции), он работает правильно.Есть другие идеи?

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

1. Отсутствует, неверен или отключен ключ API

Кажется, чаще всего. Рекомендую следовать официальной документации . Если вы завершите все шаги, проблема останется, и вы все еще не уверены, может ли это быть причиной, клонируйте официальные образцы Android, найдите образец MapWithMarker (android-samples / tutorials / MapWithMarker) и протестируйте его. Если вы запустили пример, и он правильно отображает карту, попробуйте заменить API-ключ по умолчанию на тот, который у вас есть.

В таком случае убедитесь, что вы включили его в Google API Console.

2. Отсутствует тег метаданных версии Android GMS

Ваш AndroidManifest.xml должен определить следующий атрибут метаданных:

<meta-data android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />

См. Ответ здесь для получения более подробной информации и официальной документации.

3. Отсутствующие права пользователя

В более старых версиях Android SDK вам приходилось явно устанавливать определенные права пользователя для корректной работы с Google Maps API, например:

<uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Это уже не так, но я бы порекомендовал посетить официальную документацию, чтобы убедиться, что вы соответствуете этим требованиям к версии.

4. Требование к OpenGL ES версии 2

В прошлом, казалось, требовалось указать следующий атрибут метаданных в AndroidManifest.xml

<uses-feature   
   android:glEsVersion="0x00020000"  
   android:required="true"/>
0 голосов
/ 01 июня 2019

Получили ли вы ключ для API карт Google?если вам не нужно было получать ключ для использования карты Google в вашем приложении

, перейдите по этой ссылке Получите ключ API

...