Android apk无法使用PHP检索超过3g的数据,在wifi上工作正常

时间:2013-03-28 18:12:51

标签: java php android http-post

我的apk有问题。这一切都已经完成,但最后的测试让我感到痛苦。

我们走了。 App使用以下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;
}

当我在wifi上工作时它工作正常,但后来我尝试了3g(HSDPA)和2g(EDGE),但它没有用。好吧,不完全是因为我可以连接到服务器来检查用户名和密码并检索一些成功输入的信息(json数组中大约300个字符)但是当我试图检索更长的字符串(大约8k个字符)时它给了我此字符串:“httprequest被主机中断”而不是JSONArray的String。如果信号不够好,我也做了一个循环尝试更多次,但它也没有帮助。

我的代码是否遗漏了某些部分?我正在测试三星Galaxy标签2.哦,当我用我的手机(不同提供商)更换SIM卡时,它有效。有时我不得不在我的应用程序中按下刷新按钮但它有效。我知道它与此提供程序有关,但其他应用程序可以使用它并且不会抛出这种错误,所以我需要解决这个问题。救命? :)

我经常搜索这个问题但是没有为开发人员提供适当的答案。

如果您需要更多信息,请轻推我。

谢谢!

进展编辑:

发送给PHP == OK
执行PHP脚本==确定
检索此输出==不行!

新发现。当我调用方法从服务器检索数据并且此传输成功时,我按顺序获得Toasts:
1.创建JSONArray确定
2.内部JSONArray doInBackground(String ... params)
3. HTTPPost OK
4. InputStream创建了
5. StringBuffer填充
6.保存到json String OK
7.(JSONArray)jAry创建了

如果不成功则按顺序排列:
1.创建JSONArray确定
2.抛出错误,JSONArray = null
3.内部JSONArray doInBackground(String ... 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()中会有帮助吗?方法?我怀疑在移动网络有时间做出反应之前会抛出错误,因为主线程并没有“等待”完成此任务。

2 个答案:

答案 0 :(得分:1)

三天后OK问题解决了! :)

来源还可以,PHP没问题,服务器设置还可以,除了Galaxy选项卡上的默认设置以便在互联网上连接外,一切都很好。 ISP设置代理(用于嗅探我们,普通人当然在做什么)阻止来自PHP的响应,因此没有收到答复。删除代理后,一切工作都应该如此。

感谢@forgivegod和@chrkad帮助我并了解了更多关于众多java类和设置的知识。 :)

干杯:)

答案 1 :(得分: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);