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 配列で約 300 文字) を取得できたため、完全ではありませんが、少し長い文字列 (約 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(); に移動すると役に立ちますか? 方法?メインスレッドがこのタスクの終了を「待機」していないため、モバイルネットワークが反応する前にエラーがスローされたと思われます。