PhoneGap на Android: у меня плохой поток информации между HTML <-> JS <-> PlugIn <-> Activity - PullRequest
2 голосов
/ 01 декабря 2011

У меня проблема ... (Правда? :-))

Что я хочу сделать?

Мне нужно создать собственный плагин для запуска MapActivity (чтобы показать POI, показать маршруты, ...), и когда mapView закрывается с некоторыми условиями, мне нужно загрузить определенную HTML-страницу.

Итак:

.HTML-страница с событиями JS -> Подключаемый модуль .JS -> Подключаемый модуль .Java - (запуск) -> .Java MapActivity

А когда закончится моя MapActivity:

MapActivity отправляет [Status.ok] или [сообщение] X-> .Java PlugIn -> .JS CallBack -> Загрузить новую страницу

В чем проблема?

Но, к сожалению, у меня есть этот поток:

-> .java Plugin Execute: {Launch (MapActivity); обратный ответ}

и затем моя картографическая активность запускается, но мой обратный вызов уже прошел без каких-либо данных.

Другая проблема: PhoneGap, похоже, отменяет onActivityResult (), невозможно получить данные обратного вызова в MapViewPlugin.java

код?

mapview.js - Плагин

Проблема с callBack , который вызывается до запуска MapActivity. Спящий режим (2000) - это обходной путь для отображения новой страницы после отображения MapView. Но это не очень хорошая проблема!

MapView.prototype.showItineraryMapView = function(itineraryEncoded, startLat,
        startLong, startTitle, startDesc, finishLat, finishLong, finishTitle,
        finishDesc, callBack) {
    PhoneGap.exec(function() {
        sleep(2000);
        callBack();
    }, function(){} , "MapView", "show_itinerary", [ itineraryEncoded, startLat, startLong,
            startTitle, startDesc, finishLat, finishLong, finishTitle,
            finishDesc ]);
};

function sleep(ms) {
    var dt = new Date();
    dt.setTime(dt.getTime() + ms);
    while (new Date().getTime() < dt.getTime());
}

MapViewPlugin.java - Плагин

@Override
public PluginResult execute(String action, JSONArray data, String callbackId)
{
    Log.i("MapViewPlugin", "Début MapViewPlugin");

    PluginResult result = null;
    if (action.equals(ACTION_SHOW_ITINERARY))
    {
        Log.i("MapViewPlugin", "showItineraryMapView");
        try
        {
            return this.showItineraryMapView(data.getString(0), data.getInt(1), data.getInt(2), data.getString(3), data.getString(4), data.getInt(5), data.getInt(6), data.getString(7), data.getString(8));
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }
    else
    {
        result = new PluginResult(Status.INVALID_ACTION);
        Log.d("MapViewPlugin", "Invalid action : " + action + " passed");
    }
    return result;
}
private PluginResult showItineraryMapView(String encoded_itinerary, int startLat, int startLong, String startTitle, String startDesc, int finishLat, int finishLong, String finishTitle, String finishDesc)
{
    Log.i("MapViewPlugin", "Start showMapView()");
    Intent iMapView = new Intent(ctx, MapViewActivity.class);
    iMapView.putExtra(MODE, MODE_ITINERARY);
    iMapView.putExtra(ITINERARY_ENCODED, encoded_itinerary);
    iMapView.putExtra(START_LAT, startLat);
    iMapView.putExtra(START_LONG, startLong);
    iMapView.putExtra(START_TITLE, startTitle);
    iMapView.putExtra(START_DESC, startDesc);
    iMapView.putExtra(FINISH_LAT, finishLat);
    iMapView.putExtra(FINISH_LONG, finishLong);
    iMapView.putExtra(FINISH_TITLE, finishTitle);
    iMapView.putExtra(FINISH_DESC, finishDesc);

    Log.i("MapViewPlugin", "Launching intent...");

    ctx.startActivity(iMapView);

    return new PluginResult(Status.OK);
}

Я не знаю, хорошее ли это решение, возможно, я ошибаюсь. Кто-нибудь может мне помочь?

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

Спасибо'S!

1 Ответ

5 голосов
/ 01 декабря 2011

Это не совсем верно. Вот несколько изменений, которые должны вас расклеить. Сначала вам нужно сохранить callbackId, который передается в execute. Затем в вашем методе execute вызовите showItineraryMapView (), но не заставляйте его возвращать PluginResult, чтобы он возвращал void.

Сразу после вызова метода showItineraryMapView () сделайте следующее:

PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
r.setKeepCallback(true);
return r;

Затем в showItineraryMapView () вы хотите вызвать ctx.startActivityForResult () вместо ctx.startActivity () и сразу же после этого удалить строку, которая возвращает новый PluginResult.

Тогда вам нужно переопределить метод onActivityResult (). Здесь вы получите информацию из MapView. Тогда вы в конечном итоге звоните:

this.success(new PluginResult(PluginResult.Status.OK, myData), this.callbackId);

где "myData" - это информация, которую вы хотите передать обратно на сторону JavaScript, а "this.callbackId" - это идентификатор обратного вызова, который вы сохранили в методе execute.

...