0

apk に問題があります。それはすべてすでに行われていましたが、最後のテストで頭が痛くなります。

どうぞ。アプリは、以下の PHP ハンドラーを使用して mysql データベースにデータを挿入します。

<?php

$dbh=mysql_connect("www.someDomain.com",$_REQUEST['uiBaze'],$_REQUEST['gBaze']);
mysql_set_charset("utf8", $dbh);

mysql_select_db($_REQUEST['dbName']);

$q=mysql_query($_REQUEST['sql']);
while($e=mysql_fetch_assoc($q)){
$output[]=$e;
}

$encoded = json_encode($output);

print($encoded);

mysql_close();
?>

この単純な php を使用すると、アプリに必要なものを十分に挿入、更新、および選択できます。

次に、接続に以下の AsyncTask クラスを使用します。

protected JSONArray doInBackground(String... params) {
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(linkPhp);
        UrlEncodedFormEntity uefe=new UrlEncodedFormEntity(postparams, HTTP.UTF_8);
        uefe.setContentEncoding(HTTP.UTF_8);
        httpPost.setEntity(uefe);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();

        is = httpEntity.getContent();
    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }
    try {

        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "UTF-8"));

        StringBuilder sb = new StringBuilder();

        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    try {
        if (json!=null) {
            jAry = new JSONArray(json);
        } else {
            jAry=new JSONArray();
        }
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    return jAry;
}

Wi-Fi を使用しているときは問題なく動作しましたが、3g (HSDPA) と 2g (EDGE) で試してみましたが、動作しませんでした。サーバーに接続してユーザー名とパスワードを確認し、入力の成功に関する詳細情報 (json 配列で約 3​​00 文字) を取得できたため、完全ではありませんが、少し長い文字列 (約 8k 文字) を取得しようとすると、この文字列: JSONArray の文字列ではなく、「httprequest がホストによって中断されました」。また、信号が十分でない場合は、さらに試行するループを作成しましたが、それも役に立ちませんでした。

私のコードにはいくつかの部分がありませんか? samsung galaxy tab 2でテストしています。ああ、SIMカードを携帯電話(別のプロバイダー)のものと交換すると、機能しました。時々、アプリの更新ボタンを押さなければなりませんでしたが、うまくいきました。このプロバイダーと関係があることは理解していますが、他のアプリはそれで動作し、そのようなエラーをスローしないため、この問題を回避する必要があります. ヘルプ?:)

私はその問題をよく探しましたが、開発者にとって適切な答えはまだありませんでした.

さらに情報が必要な場合は、私を微調整してください。

ありがとうございました!

進行状況編集:

PHP への送信 == OK
PHP スクリプトの実行 == OK
この出力の取得 == OK ではありません!

新しい発見。メソッドを呼び出してサーバーからデータを取得し、この転送が成功すると、
Toastsが次の順序で
取得 され ます
。 6. json 文字列に保存 OK 7. (JSONArray) jAry が作成されました




成功しない場合は、次の順序になります
。 1. JSONArray の作成 OK
2. JSONArray=null のエラーがスローされる
3. JSONArray 内 doInBackground(String... params)
4. HTTPPost OK
5. InputStream が作成される
6. StringBuffer が埋められる
7 . json 文字列に保存 OK
8. (JSONArray) jAry エラー: HTTPRequest がホストによって中断されました

私は考えています...私はこの順序でメソッドを呼び出しています:

JSONArray jAryS = getJsonArray(nameValuePair);

この行はタスクを実行します:

public JSONArray getJsonArray(ArrayList<NameValuePair> params) {
    VrniJSONArray task = new VrniJSONArray(params, PodatkiPrograma.LOKACIJA_PHP);
    try {
        return task.execute().get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
}

上記の doInBackground() のコードが実行されます。

コードを getJsonArray(); に移動すると役に立ちますか? 方法?メインスレッドがこのタスクの終了を「待機」していないため、モバイルネットワークが反応する前にエラーがスローされたと思われます。

4

2 に答える 2

1

OK 問題は 3 日後に解決しました。:)

ソースはOK、PHPはOK、サーバー設定はOK、インターネットに接続するためのGalaxyタブのデフォルト設定以外はすべて問題ありませんでした. ISP は、PHP からの応答をブロックしたため、応答が受信されなかったプロキシを設定しました (もちろん、私たち一般の人々が行っていることを盗聴するため)。プロキシを削除した後、すべてが正常に機能しました。

@forgivegod と @chrkad に感謝します。私を助け、多くの Java クラスと設定について詳しく教えてくれました。:)

乾杯 :)

于 2013-03-29T11:54:49.793 に答える
0

httpclient がタイムアウトしています。代わりに、このように作成します。

    int timeout = 20000;  // 20 seconds

    // Configure the params and ssl 
    HttpParams httpParams = new BasicHttpParams();
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

    ThreadSafeClientConnManager connManager = new ThreadSafeClientConnManager(httpParams, schemeRegistry);

    // HTC Thunderbolt and certain LG Devices  has an issue where the socket buffer size was set to 2 MB (!), which
    // would cause OutOfMemoryErrors.  As a workaround, manually set the buffer size back to the
    // usual default of 8 KB.  See:
    //   http://stackoverflow.com/questions/5358014/android-httpclient-oom-on-4g-lte-htc-thunderbolt
    HttpConnectionParams.setSocketBufferSize(httpParams, 8192);

    HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);

    // Create the HttpClient instance
    DefaultHttpClient httpClient = new DefaultHttpClient(connManager, httpParams);
于 2013-03-28T18:19:54.103 に答える