Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 键入Darray作为Cordova插件参数_Java_Javascript_Cordova_Sencha Touch_Typed Arrays - Fatal编程技术网

Java 键入Darray作为Cordova插件参数

Java 键入Darray作为Cordova插件参数,java,javascript,cordova,sencha-touch,typed-arrays,Java,Javascript,Cordova,Sencha Touch,Typed Arrays,我正在为Cordova 3.3开发一个插件 在我的javascript部分,我下载了一个pdf文件,该文件存储为uInt8Array download: function ( ) { var xhr = new XMLHttpRequest(); xhr.open('GET', 'url/to/pdf', true); xhr.responseType = 'arraybuffer'; xhr.setRequestHeader('A

我正在为Cordova 3.3开发一个插件

在我的javascript部分,我下载了一个pdf文件,该文件存储为uInt8Array

download: function ( ) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'url/to/pdf', true);
        xhr.responseType = 'arraybuffer';
        xhr.setRequestHeader('Accept', 'application/pdf');

        xhr.onload = function(e) {
            var uInt8Array = new Uint8Array(this.response); 

            window.plugins.filedownloader.saveFile(
                uInt8Array,
                "Downloads",
                function ( response ) {
                    console.log("success");
                },
                function ( response ) {
                    console.log("failure");
                }
            );
        };

        xhr.send();
    },
我将uInt8Array提交给我的cordova插件的save方法。 我的插件的javascript部分如下所示:

var exec = require('cordova/exec');

function FileDownloader() {
};

FileDownloader.prototype = {
    login: function ( loginUrl, params, username, password, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "doLogin", [ loginUrl, params, username, password ] );
    },

    getHtmlPage: function ( url, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "getHtmlPage", [ url ] );
    },

    downloadAndSaveFile: function ( url, saveFolder, successCallback, failureCallback ) {
        exec( successCallback, failureCallback, "FileDownloader", "downloadAndSaveFile", [ url, saveFolder ] );
    },

    saveFile: function ( data, saveFolder, successCallback, failureCallback ) {
       exec( successCallback, failureCallback, "FileDownloader", "saveFile", [ data, saveFolder ] );  
    }
};

FileDownloader.install = function () {
    if (!window.plugins) {
        window.plugins = {}
    }

    window.plugins.filedownloader = new FileDownloader();
    return window.plugins.filedownloader;
};

cordova.addConstructor(FileDownloader.install);
java部分中的save方法如下所示:

public PluginResult execute(JSONArray args) {
                PluginResult result = new PluginResult(PluginResult.Status.OK, "blub");
                log("saveFile");

               try{
                   JSONObject dataValues = args.getJSONObject(0);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return result;
            }
我现在的问题是,typedArray不再是数组了。这是一个JSONObject。uInt8Array的索引现在是字符串,不再排序。此外,至少还有一个新的密钥“byteBuffer”


在将typedArray交给插件的java部分时,是否有一种方法将其视为JSONArray,或者是否有一种不同的方法来处理此问题?

有一种更好的方法

因为我使用的是Sencha Touch,所以我不需要自己创建xhr对象。 事实上,就像问题中所做的那样,它会导致ios内存问题,并且应用程序会因较大的文件而崩溃

Ext.Ajax.request()

downloadFile: function ( record ) {
    var me = this;
    Ext.Ajax.request({
        url: record.get("url"),
        method: 'GET',
        success: function ( response ) {
            me.onFileDownloaded( response, record );
        },
        failure: function ( response ) {
        },
        scope: this,
        responseType: "arraybuffer",
        timeout: 300000
    });
此请求的响应为arraybuffer,可按如下方式使用:

window.plugins.filemanager.saveUint8ByteArrayToFile(
            "Download",
            record.get("title"),
            response.responseBytes,
            response.responseBytes.byteLength,
            function ( filePath ) {
                me.onFileSaved( filePath );
            },
            function ( message ) {
                me.onFileSaveError( message );
            }
        );
在Android上,
response.responseBytes
将转换为base64编码字符串。在iOS上,它将转换为NSData