2016-10-01 8 views
0

私は同時に開発している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();を実行すると例外がスローされることを確認しました。

ReceiveBroadcastReceiverサブクラスは、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で使用しています。

私は何とかここでスレッディングルールのファウルを実行していると思うし、バックグラウンドスレッドやそれらの行に沿ったものから何かをやり終えるだろう。しかし、これを引き起こしているかもしれない私が誤っているかもしれないものが私にはっきりとは分かりません。ここの誰かが説明できるようになることを願っています。

+1

最初の事について

new AsyncTaskRunner().execute(); 

を。 –

+0

@VishalThakkar - あなたは精巧にできますか? HTTPUrlビット全体がasynctask内から実行されるべきであることを意味しますか? – DroidOS

+1

これはasynctask doinbackgroundを呼び出す必要があります –

答えて

1

メインスレッドでネットワーク操作を実行できません。別のスレッドでネットワーク操作を行う必要があります。独自のスレッドを作成することも、アンドロイドフレームワークが提供するAsyncTaskを使用することもできます。たとえば、次のように

class AsyncTaskRunner extends AsyncTask<Void, Void, Void> { 

    private String resp; 

    @Override 
    protected String doInBackground(String... params) { 
//don't perform UI operation here, perform network operation 
    resp = loadJSCode(); 
    return resp; 
    } 


    @Override 
    protected void onPostExecute(String result) { 
    // When network operation completed then this method is called and you 
    // can update UI from this method. 
    } 


    @Override 
    protected void onPreExecute() { 

    } 


} 

今、あなたはタスクを実行できます。詳細は、メインスレッドに代わりasynctask内のWebサービスを呼び出す必要がありhttps://developer.android.com/reference/android/os/AsyncTask.html

関連する問題