2014-07-04 20 views
6

Sto usando Phonegap 3 e il plugin Media. Continuo a ricevere questi errori durante il test il mio app su iOS:"Plugin Phoneon" ['Media'] dovrebbe usare un thread in background. "

THREAD WARNING: ['Media'] took '205.391846' ms. Plugin should use a background thread. 

Ho visto questo dalla documentazione PhoneGap (http://docs.phonegap.com/en/edge/guide_platforms_ios_plugin.md.html):

- (void)myPluginMethod:(CDVInvokedUrlCommand*)command 
{ 
    // Check command.arguments here. 
    [self.commandDelegate runInBackground:^{ 
     NSString* payload = nil; 
     // Some blocking logic... 
     CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload]; 
     // The sendPluginResult method is thread-safe. 
     [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; 
    }]; 
} 

Questo va nella mia app così com'è, o fare Devo modificarlo per ogni plugin? Dove lo metto?

Ho visto alcuni post in linea su questo, ma nessuno con una risposta chiara su come utilizzare il codice precedente.

risposta

10

Personalmente non ho ancora utilizzato il plug-in Media ma per gestire i thread in background è necessario verificare quale chiamata provoca lo warning.

Per esempio, se questo avviso tiri quando si crea un oggetto media:

var my_media = new Media(src, onSuccess, onError); 

Quindi è possibile controllare il .js file di plug-in (che è Media.js). Cercare la funzione Media e cercare la chiamata nativa che è in questo caso:

exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); 

Da questo si sa che questo è chiamata al metodo create della classe Media.
Quindi, andare e aperto Media.m (o CDVSound.m in questo caso esatto) e cercare il metodo create (si dovrebbe trovare in cordova/plugins/org.apache.cordova.media/src/ios), fine incapsulare l'intero metodo con:

[self.commandDelegate runInBackground:^{ 
    // the create method goes here 
}]; 

Questo creerà un thread in background per la creazione di media "nativi". Esso dovrebbe essere simile a questo:

- (void)create:(CDVInvokedUrlCommand*)command 
{ 
    [self.commandDelegate runInBackground:^{ 
     NSString* mediaId = [command.arguments objectAtIndex:0]; 
     NSString* resourcePath = [command.arguments objectAtIndex:1]; 

     CDVAudioFile* audioFile = [self audioFileForResource:resourcePath withId:mediaId doValidation:NO forRecording:NO]; 

     if (audioFile == nil) { 
      NSString* errorMessage = [NSString stringWithFormat:@"Failed to initialize Media file with path %@", resourcePath]; 
      NSString* jsString = [NSString stringWithFormat:@"%@(\"%@\",%d,%@);", @"cordova.require('org.apache.cordova.media.Media').onStatus", mediaId, MEDIA_ERROR, [self createMediaErrorWithCode:MEDIA_ERR_ABORTED message:errorMessage]]; 
      [self.commandDelegate evalJs:jsString]; 
     } else { 
      CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; 
      [self.commandDelegate sendPluginResult:result callbackId:command.callbackId]; 
     } 
    }]; 
} 
+2

Grazie per questa risposta molto chiara e dettagliata! Ma domanda ... E 'necessario *** fare a questo? Xcode fornisce questo avviso per ogni chiamata al plugin che richiede più di 10 ms, il che non è molto lungo (non credo che gli utenti noteranno un ritardo <100ms). Posso tranquillamente ignorare questo avvertimento, o questo avvertimento farà sì che Apple respinga la mia app? – mattstuehler

+0

Infine qualcuno ha fornito dei passaggi su come trovare la causa principale. –

+1

@mattstuehler questo può essere necessario a volte quando il codice impiega più tempo del previsto o semplicemente congela l'interfaccia utente. –

-4

1.Open progetto XCode.

2. Fare clic sulla scheda di impostazione 2 "Funzionalità".

3.Attivare "Modalità sfondo" su.

4. Scegliere "Audio e Airplay".

Fatto.Ora puoi riprodurre la musica in sottofondo.

PS: io uso xCode 6 e Cordova 3.6.3

Problemi correlati