Multithreading Phonegap“;[&"x27;媒体&"x27;]插件应使用后台线程;

Multithreading Phonegap“;[&"x27;媒体&"x27;]插件应使用后台线程;,multithreading,cordova,plugins,background,media,Multithreading,Cordova,Plugins,Background,Media,我正在使用PhoneGap3和媒体插件。在iOS上测试我的应用程序时,我不断遇到以下错误: THREAD WARNING: ['Media'] took '205.391846' ms. Plugin should use a background thread. 我在phonegap文档()中看到了这一点: 这是按原样进入我的应用程序,还是我需要为每个插件编辑它?我应该把它放在哪里 我在网上看到过一些关于这方面的帖子,但没有一篇对如何使用上述代码给出明确答案 就我个人而言,我还没有使用媒体插

我正在使用PhoneGap3和媒体插件。在iOS上测试我的应用程序时,我不断遇到以下错误:

THREAD WARNING: ['Media'] took '205.391846' ms. Plugin should use a background thread.
我在phonegap文档()中看到了这一点:

这是按原样进入我的应用程序,还是我需要为每个插件编辑它?我应该把它放在哪里


我在网上看到过一些关于这方面的帖子,但没有一篇对如何使用上述代码给出明确答案

就我个人而言,我还没有使用
媒体
插件,但要处理后台线程,您需要检查哪个调用导致了
警告

例如,如果在创建
媒体
对象时引发此警告:

var my_media = new Media(src, onSuccess, onError);
然后您可以检查插件
.js
文件(即
Media.js
)。查找函数
Media
,并查找本机调用,在本例中:

exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
由此可知,这是在调用
Media
类的
create
方法。
因此,打开
Media.m
(或者在这种情况下是
CDVSound.m
)并查找
create
方法(您应该在
cordova/plugins/org.apache.cordova.Media/src/ios
中找到),最后用以下内容封装整个方法:

[self.commandDelegate runInBackground:^{
    // the create method goes here
}]; 
这将为“本机”媒体创建创建一个后台线程。 应该是这样的:

- (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];
        }
    }];
}

1.打开您的xCode项目

2.单击设置选项卡2“能力”

3.打开“背景模式”

4.选择“音频和播放”

完成。现在你可以在后台播放音乐了


PS:我使用的是xCode 6和Cordova 3.6.3

感谢您提供了非常清晰、详细的回复!但问题是。。。有必要这样做吗?Xcode为任何耗时超过10毫秒的插件调用提供了此警告,这并不长(我认为用户不会注意到有人提供的关于如何找到根本原因的步骤)。@mattstuehler有时当代码耗时超过预期或只是冻结用户界面时,这可能是必要的。
- (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];
        }
    }];
}