我的問題與我的apk。這是一切已經完成,但最後的測試使我的肚皮疼痛。安卓apk版無法通過3g使用PHP檢索數據,在wifi上工作正常
我們走吧。應用程序中插入一些數據MySQL數據庫與PHP如下處理:
<?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;
}
它工作正常,當我在WiFi但後來我嘗試了3G(HSDPA)和2G(EDGE),並沒有奏效。好吧,不完全是因爲我可以連接到服務器來檢查用戶名和密碼,並檢索成功輸入(約300個字符在json數組中)的更多信息,但是當我試圖檢索更長的字符串(大約8k字符)時,它給了我這個字符串:「httprequest被主機中斷」而不是JSONArray的String。如果信號不夠好,我也做了一個循環嘗試更多次,但它沒有幫助。
我的代碼是否缺少一些部分?我正在測試三星銀河標籤2.哦,當我用手機(不同的提供商)替換SIM卡時,它工作。有時我不得不在我的應用程序中按刷新按鈕,但它工作。我知道它與這個提供商有關,但其他應用程序可以使用它,並且不會拋出那種錯誤,所以我需要圍繞這個問題。幫幫我? :)
我搜索了很多問題,但沒有給出適當的答案給開發者。
如果您需要更多信息,請使我推動。
謝謝!
進展編輯:
發送到PHP == OK
執行PHP腳本== OK
檢索此輸出==也不行!
新發現。當我打電話的方法來從服務器檢索數據,這轉移是成功的,我得到敬酒的順序:
1.創建JSONArray OK
2.內部JSONArray doInBackground(字符串... PARAMS)
3. HTTPPost OK
4.創建的InputStream
5. StringBuffer的填充
6.保存到JSON字符串行
7.(JSONArray),其中jAry創建
當不是成功,則它在這個順序:
1。創建JSONArray OK
2時拋出錯誤,JSONArray = NULL
3.內部JSONArray doInBackground(字符串... PARAMS)
4. HTTPPost OK
5.創建的InputStream
6. StringBuffer的充滿
7.保存json String 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(),會有幫助嗎?方法?我懷疑在移動網絡有時間做出反應之前會拋出錯誤,因爲主線程並未「等待」完成此任務。
我仍然得到相同的結果:「HttpRequest被主機中斷!」 – Matjaz
@Matjaz然後你的服務器正在做它不應該做的事情。 – kaderud
我不認爲這是服務器問題。正如我所說的,我測試了另一個具有不同提供商的SIM卡,並且它工作正常。 – Matjaz