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


Android apk fail to retrieve data over 3g using PHP, on wifi works ok

我的apk有问题。一切都已经做完了,但是最后的测试让我头疼。

开始。应用程序插入一些数据到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。如果信号不够好,我也做了一个循环来尝试更多的次数,但它也没有帮助。

我的代码缺少某些部分吗?我正在测试三星galaxy tab 2。哦,当我用手机(不同的供应商)的sim卡更换sim卡时,它工作了。有时我不得不按下刷新按钮在我的应用程序,但它工作。我明白它与这个提供商有关,但其他应用程序与它一起工作,不会抛出那种错误,所以我需要绕过这个问题。帮助吗?:)

我搜索了这个问题很多,但没有给开发人员适当的答案。

如果你需要更多的信息,请告诉我。

谢谢!

进步编辑:

发送到PHP == OK
执行PHP脚本== OK
检索此输出== NOT OK!

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

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

三天后问题解决了!:)

源是OK的,PHP是OK的,服务器设置是OK的,所有都是好的,除了默认设置在Galaxy标签连接到互联网。ISP设置代理(用于嗅探我们,当然是普通人正在做的事情),阻止来自PHP的响应,因此没有收到任何回答。删除代理后,一切正常。

感谢@宽恕上帝和@chrkad,他们帮助了我,让我了解了更多关于java类和设置的知识。:)

欢呼:)

您的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);