私は同時に開発している1つのプラグインを使用するAndroid用Phonegapアプリを作成中です。このアプリはRhinoを使用して、JavaScriptで一連のデータ分析操作を実行します。これを行う理由の1つは、アプリのバージョンの更新を強制することなく、必要に応じてデータ分析ルールを自動的に更新できるようにすることです。Android HTTPUrlConnectionエラー
Rhinoで使用されるJavaScriptコードは、アプリによってダウンロードされ、内部ストレージに保存されます。アプリが起動すると、それはJSコードファイルの存在をチェック:これは、アプリケーションの起動では二つの方法
- に起こります。存在しない場合は、サーバーから取得します。
- プッシュメッセージへの応答:必要に応じて、更新されたJSコードをサーバーから取得しようとすることによって反応するプッシュメッセージをアプリに送信します。
どちらのルートも、基本コードの同じビットを使用してJSコードを更新します。最初のものは問題なく動作します。しかし、2番目の例外は例外をスローします。
関連するコードのPhoneGapはそのonDeviceReady
イベントをトリガしたときに上記と呼ばれ
private boolean doInit(CallbackContext cbc)
{
Storage.setFilePath(this.context.getFilesDir());
Storage.loadJSCode();
...
}
- i.e.whenは、アプリが起動します。
Storage
は、アプリケーションでのファイルI/O操作を処理するための汎用クラスです。実際loadJSCode
は
- フィードバックは、私は、ユーザーにコンテンツを表示することを伴うすべての操作を処理するために使用するクラスです
public static String loadJSCode() { try { String rslt = ""; HttpURLConnection conn = null; addr = "https://path/to/rhinocode.php"; try { URL url = new URL(addr); conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("User-Agent", Statics.USER_AGENT); InputStream ips = conn.getInputStream(); //THE EXCEPTION IS THROWN HERE int responseCode = conn.getResponseCode(); if (200 != responseCode) { Feedback.logError("GET error: " + responseCode + " on " + addr); return null; } BufferedReader bufr = new BufferedReader(new InputStreamReader(ips)); String line; while ((line = bufr.readLine()) != null) rslt += line; bufr.close(); } finally{if (null != conn) conn.disconnect();} return rslt; } catch(Exception e) { Feedback.logError("get fault " + Utils.stackTrace(e)); return null; } } }
説明のノートのカップルの下に表示されます。
- Utilsは、さまざまなユーティリティルーチンをカプセル化するために使用するクラスです。この例では、stackTraceルーチンは、文字列として問題を引き起こした完全なスタックトレースを提供します。
loadJSCode
に問題の呼び出しをトリガープッシュメッセージハンドラは、この問題に至るまでの完全なスタックトレースがいくつかのくぼみによって
android.os.NetworkOnMainThread Exception
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictM ode.java:1 156)
at com.android.org.conscrypt.OpenSSLSocketImpl.close(OpenSSLSock etImpl.javal 009)
at com.android.okhttp.Connection.c1ose(Connection.java:175)
at com.android.okhttp.internal.Util.c1oseQuietly(Util.java:110)
at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java: 447)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.disconnect
(HttpURLConnectionImpl.java:104)
at
com.android.okhttp.internal.http.HttpsURLConnectionlmpl.
disconnect(HttpsURLConnectionImpl java:124)
at example.com.plugin.Storage.IoadJSCode(Storage.java:28)
at example.com.plugin.Receive.onReceive (Receive.java:50)
at android.app.ActivityThread.handle (Storage.java:28)
at com.example.plugin.Receive.onReceive (Receive.java:50)
at android.app.ActivityThread.handle Receiver(ActivityThread.java:2585)
at android.app.ActivityThread.access $1800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1409)
at android.os.Handler.dispatchMessage(Handler.java:1 10)
at android.os.Looper.loon(Looper.java)
$1800(ActivityThread.java 51)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java 409)
at android.os.HandlerdispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper java:193)
at android.app.ActivityThread main(ActivityThread.java:5304)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.Zygotelnit $MethodAndArgsCaller.run(Zygote
at android.os.Looper.loop(Looper.jav a:193)
at android.app.ActivityThread.main(ActivityThread.java:5304)
at java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:515) at
com.android.internal.os.Zygotelnit
$MethodAndArgsCaller.run(Zygot elnit.java:824)
at com.android.internal.os.Zygotelnit .main(Zygotelnit.java:640)
at dalvik.system.NativeStart.main
下に表示され
public class Receive extends BroadcastReceiver
{
@Override
public void onReceive(Context context,Intent intent)
{
Bundle extras = intent.getExtras();
if (extras != null)
{
if (extras.getString("message") != null &&
extras.getString("message").length() != 0)
{
try
{
JSONObject jo = new JSONObject(extras.getString("message"));
int code = jo.optInt("kind",0);
if (1 == code) storage.loadJSCode();
} catch(Exception e){Feedback.setError(e.getMessage());}
}
}
}
}
の下に示されています実験私は、上記のloadJSCode
が実行されたときに、InputStream ips = conn.getInputStream();
を実行すると例外がスローされることを確認しました。
Receive
BroadcastReceiver
サブクラスは、plugin.xml
ファイルに埋め込まれている以下の方法で解決されます。
<receiver android:name="com.example.plugin.Receive"
android:exported="false">
<intent-filter>
<!-- Do not modify this -->
<action android:name="pushy.me" />
</intent-filter>
</receiver>
私はPhonegap CLI 6.3.3をJava 7で使用しています。
私は何とかここでスレッディングルールのファウルを実行していると思うし、バックグラウンドスレッドやそれらの行に沿ったものから何かをやり終えるだろう。しかし、これを引き起こしているかもしれない私が誤っているかもしれないものが私にはっきりとは分かりません。ここの誰かが説明できるようになることを願っています。
最初の事について
を。 –
@VishalThakkar - あなたは精巧にできますか? HTTPUrlビット全体がasynctask内から実行されるべきであることを意味しますか? – DroidOS
これはasynctask doinbackgroundを呼び出す必要があります –