2013-03-28 17 views
0

我的問題與我的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(),會有幫助嗎?方法?我懷疑在移動網絡有時間做出反應之前會拋出錯誤,因爲主線程並未「等待」完成此任務。

回答

1

OK問題解決了三天! :)

源是好的,PHP是好的,服務器設置是確定的,除了在Galaxy選項卡上默認設置連接互聯網以外,一切都很好。 ISP設置代理(用於嗅探我們,普通人當然正在做什麼),阻止PHP的響應,因此沒有收到答覆。刪除代理後,一切工作就像它應該。

感謝@forgivegod和@chrkad,幫助我學習了更多關於衆多java類和設置的知識。 :)

乾杯:)

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); 
+0

我仍然得到相同的結果:「HttpRequest被主機中斷!」 – Matjaz

+0

@Matjaz然後你的服務器正在做它不應該做的事情。 – kaderud

+0

我不認爲這是服務器問題。正如我所說的,我測試了另一個具有不同提供商的SIM卡,並且它工作正常。 – Matjaz

相關問題