1

PhoneGap で奇妙な動作が見られます。OnDeviceReady は起動しますが、「デバイス」変数を​​使用しようとすると、まだ定義されていません。私はこれに話しかけるいくつかのコードを見つけ、実際に変数を使用するために setTimeout を使用して 1 秒待機する (再び、準備ができたと表示された後) と述べました (以下)。

setTimeout(function () {
    MobileDevice = new MobiDevice(device);
}, 1000);

これは最初は機能しているように見えましたが、現在は時間が不確定のようです。最近、タイムアウトを 5000 に上げる必要がありました。これが現在のコードです。

setTimeout(function () {
    console.log("starting setup");
    try {
            MobileDevice = new MobiDevice(device);

        console.log("created MobiDevice from a real device");
    }
    catch (error) {
        console.log("no device reference - mocking device");
        var d = {
            platform: "Android",
            version: 5
        };

        MobileDevice = new MobiDevice(d);
    }

    console.log("device setup complete");
}, 5000);

実際に時間が不確定である場合、これを回避するために他の人が使用した戦略は何ですか. 不確定ではない場合、修正を探すことができる領域はどこですか。

前もって感謝します

4

2 に答える 2

1

ポーリングを使用することをお勧めします。

setTimeout(function () {
    if(device !== undefined)
        MobileDevice = new MobiDevice(device);
    else
        setTimeout( arguments.callee, 1000 );
}, 1000);

必要に応じて、タイムアウト制限(ここでは1000ms)で調整して、呼び出しのたびに減少するようにすることができます...ポイントを取得します。

于 2012-05-18T15:30:04.270 に答える
0

したがって、ここでの答えは 2 つあります。1つは、PhoneGapが何であるかであり、PhoneGapがデバイスの準備ができていると判断した後でも、デバイス変数が初期化されるのを待つ必要があります。setInterval を使用し、「device」を使用できるようになるまで待ってからラッパーに渡しました。

これのもう1つの部分はウェブでした。テスト中、デバイスのモックを作成してデバイスの初期化を省略できるようにしたいと考えていました。

if (navigator.platform.match(/(mac|win)/i)) {
        console.log("on a browser, mocking the device");
        // we are on the browser
        // you can manually set properties here to test for different devices
        var d = {
            platform: "Android",
            version: 5
        };

        MobileDevice = new MobiDevice(d);
    }
    else {

現時点では、iPhone と Android のみを対象としているため、navigator.platform だけを指定すると、ブラウザーが実行されているプラ​​ットフォームを取得できます。これは、Windows、iPhone、Android、および Mac で異なります。区別できるほど十分に異なります。WP をサポートすることを決定した場合、これを変更する必要があります。

于 2012-05-18T19:33:50.903 に答える