0

PhoneGapを送信するAndroid用のプラグインを作成しましたemail

public PluginResult execute(String action, JSONArray args, String callbackId) {
    try {
        // i want to call a function from other class so i did the
        // below, but it is throwing  the above said error...

        WebActivity wb = new WebActivity();
        wb.createExternalStoragePrivateFile(img);

        //sending email code here
    }
}

上記のコードで、別のクラスの関数にアクセスしているときに、次のエラーが発生します。

エラーhandlerを呼び出していない内部スレッドを作成することはできません。Looper.prepare()

関数を呼び出すための正しいアプローチは何ですか?

4

1 に答える 1

1

が実際にアクティビティである場合WebActivity(つまり、extendsであるActivity場合)、いくつかの問題があります。


Activity自分でオブジェクトを作成してはいけません。できますが、コンテキストを割り当てて(内部を使用しないと不可能かどうかはわかりません)、アクティビティのライフサイクルを管理する必要があります。

アクティビティオブジェクトを作成して関数を呼び出すことはできません。この関数には、ライフサイクルとコンテキストの依存関係がある場合があります(つまり、アクティビティを「再開」する必要がある場合があります)。


表示されるエラーは、それぞれActivityがUIスレッドから(または少なくともLooperスレッドから)呼び出されることを期待している結果です。あなたが最もよく呼び出す関数はHandler、直接的または間接的に何らかの方法で使用されます。そして、この関数がを作成してHandlerからメッセージを投稿すると、表示さRunnableれるエラーが発生します。

しかし、繰り返しになりますが、これは、これActivityまでのように使用することを意図したものではないためです。アクティビティを作成して、そのメソッドの呼び出しを開始することはできません。あなたは基本的にそれの状態モデルに違反します。したがってActivity、機能することすら想定されていません。


解決策として、を制御できる場合は、関数を独立したクラスWebActivityに移動createExternalStoragePrivateFile()するか、静的にする(可能な場合)か、またはその両方を行います。それを機能させるには、おそらく1つか2つ修正する必要があります。ただし、少なくとも他の場所から関数を呼び出すことはできます。

于 2011-12-20T08:01:54.030 に答える