2013-03-21 13 views
5

Zbudowałem bardzo prostą wtyczkę PhoneGap, aby rozpocząć testowanie sposobu, w jaki zamierzam tworzyć pewne rodzime działania na Androidzie.Zdobądź zwróconą wartość z wtyczki PhoneGap

JavaScript:

function callNativePlugin() { 
      cordova.exec(nativePluginResultHandler, nativePluginErrorHandler, "Database", "saveAdvertencia", [ 1, "TesteAdv" ]); 
     } 

    function nativePluginResultHandler(result) { 
     alert("SUCCESS: \r\n" + result); 
    } 

    function nativePluginErrorHandler(error) { 
     alert("ERROR: \r\n" + error); 
    } 

Java:

@Override 
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
    if (action.equals("saveAdvertencia")) { 
     advertenciaDS = new AdvertenciaDS(cordova.getActivity()); 
     callbackContext.sendPluginResult(new PluginResult(Status.OK, new JSONArray("test"))); 
     return true; 
    } 
    return false; 
} 

Co potrzebne jest sposobem, aby pobrać wynik z działania w tej samej metody. To bardzo skomplikowane, aby zawsze radzić sobie z 3 metodami (1, aby wykonać akcję.) 1, aby zdefiniować, co będzie sukcesem. 1, aby określić, co będzie działaniem błędu.), Kiedy nie kontrolujesz, kiedy są wywoływane, ponieważ PhoneGap dzwoni do nich po wykonaniu czynności.

Jeśli muszę odzyskać niektóre dane z Android Native bazy danych:

  1. połączeń w JavaScript z "cordova.exec".
  2. PhoneGap wywoła Twoją wtyczkę.
  3. Twoja wtyczka zwróci 2 rzeczy: Boolean dla PhoneGap definiujący to wszystko działało zgodnie z oczekiwaniami lub nie. Dane, które zostaną przekazane do skutecznych metod.
  4. Oto część trudna dla mnie. Jeśli zakończy się powodzeniem, musisz utworzyć dwie metody, których nie masz kontroli, kiedy zostaną wywołane, ponieważ zdecyduje o tym PhoneGap. Jak mogę to zmienić?
+0

@mafutrct Dzięki za korektę formacie tekstowym! – MBarni

+0

Wszystko należy do @Real, właśnie naprawiłem mały detal – mafu

Odpowiedz

5

Używam tego wzoru mieć tylko jednego wywołania zwrotnego dla funkcji przewidzianych przez wtyczkę:

function callNativePlugin(callback) { 
    cordova.exec(function(result) { 
     callback(null, result); 
    }, function(result) { 
     callback("myerror"); 
    }, "Database", "saveAdvertencia", [ 1, "TesteAdv" ]) 
}; 

ten sposób można uzyskać node.js callbacków stylu, w którym pierwszy argument to błąd, a drugi jest rezultat:

//define the callback function 
var callbackFunction = function(err, result) { 
    if (err) { 
     console.log("there was an error"); 
    } else { 
     console.log("success", result); 
    } 
}; 

//call the plugin 
callNativePlugin(callbackFunction); 

nie można uniknąć dwóch zwrotnych w swojej wtyczki, tak jak to zostało upoważnione przez API Cordova, ale nie trzeba się narażać, że dla użytkowników wtyczki.

+0

Masz na myśli callNativePlugin? –

+0

Przepraszam ... Tęsknię za zrozumieniem kodu. Już to działa. – MBarni

+0

Czy to źle? (nowa wersja) http://pastebin.com/MTAH3MZN – MBarni

0

ciągu JavaScript, udało mi się pobrać wartość wtyczki PhoneGap tylko jeden łatwo kontrolowany metodą rekurencyjną:

function callNativePlugin(result, error, service, action, json) { 
    if (result != null) { 
     //alert("SUCCESS: \r\n" + result); 
     return result; 
    } else if (error != null) { 
     //alert("ERROR: \r\n" + error); 
     return error; 
    } 
    return cordova.exec(function(result) {callNativePlugin(result, null, null, null);}, function(error) {callNativePlugin(null, error, null, null);}, service, action, json); 
} 
+0

Jaka jest wartość tego zestawu 3 funkcji, które nadal nie działają? Zasadniczo jedna funkcja działa na trzy sposoby i nadal nie działa, ponieważ nie można zwrócić wartości synchronicznie z asynchronicznego wywołania, takiego jak cordova.exec() (a przynajmniej nie, po prostu nie powinieneś). Oznacza to, że powrót z funkcji wywołania zwrotnego nie wpływa na wartość zwracaną przez cordova.exec i prawdopodobnie występuje po zwrocie cordova.exec. Lepiej po prostu użyć go asynchronicznie, jak zaprojektowano: funkcja callback (wartość) {console.log (wartość); } cordova.exec (callback, callback, "Foo", "bar", []); –

+0

To działa i jest używane w mojej aplikacji. Po co obniżyć poziom działającego oprogramowania? Złóż własną odpowiedź, a jeśli jest ona naprawdę lepsza i dobrze wyjaśniona, zagłosuję na nią jako poprawną. – MBarni

+0

Kiedy mówię, że to nie działa, mam na myśli to, że nie zwraca wyniku ani błędu, chociaż wywoła funkcję natywną. To po prostu bardziej skomplikowana wersja tego, którą miałeś w pytaniu. Zasugeruję też inną odpowiedź. –

2

Jeśli pytasz o sposób, aby włączyć cordova.exec() z asynchronicznego wywołania do synchronicznego wywołania który zwraca wartość, krótka odpowiedź brzmi, że nie możesz. (Długa odpowiedź brzmi: możesz oszukać ją za pomocą pętli lub limitu czasu, ale nie powinieneś.)

Jak wyjaśnia Vlad, można stworzyć swój własny interfejs więc masz tylko jedną funkcję, aby zadzwonić, ale używam coś takiego prostszej wersji (w http://htmlpresenter.com/api.html):

var Database = { 
    saveAdvertencia: function(args, callback) { 
    cordova.exec(callback, 
     function(error) { console.log("Error calling Database.saveAdvertencia: " + error); }, 
     "Database", "saveAdvertencia", args) 
    } 
} 

Następnie nazwać tak dostarczanie inline zwrotna jeśli trzeba rezultat:

Database.Advertencia([1, "TesteAdv"], function(result) { alert(result); }); 

oczywiście jeśli (jak wydaje się być przypadek) nie trzeba wynik w ogóle, można po prostu użyć tej wersji:

function saveAdvertencia() { 
    log = function(message) { console.log(message) }; 
    cordova.exec(log, log, "Database", "saveAdvertencia", arguments); 
} 

saveAdvertencia(1, "TesteAdv"); 

(Edycja :) Także, to wyzwanie mogą być związane z tym lepsze pytanie:

Powiązane problemy