0

我的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;
}

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

我的代码是否缺少某些部分?我正在三星 Galaxy Tab 2 上进行测试。哦,当我用手机(不同提供商)中的 SIM 卡替换 SIM 卡时,它起作用了。有时我不得不在我的应用程序中按下刷新按钮,但它起作用了。我知道它与这个提供程序有关,但是其他应用程序可以使用它并且不会抛出那种错误,所以我需要解决这个问题。帮助?:)

我搜索了很多这个问题,但还没有为开发人员提供正确的答案。

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

谢谢!

进展编辑:

发送到 PHP == OK 正在
执行 PHP 脚本 == OK
正在检索这个输出 == 不行!

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

如果不成功,则按以下顺序:
1. 创建 JSONArray OK
2. 抛出错误,JSONArray=null
3. 在 JSONArray doInBackground(String... params) 内
4. HTTPPost OK
5. InputStream 创建
6. StringBuffer 填充
7 . Save to json String OK
8. (JSONArray) jAry error: HTTPRequest was interrupted by the host

我在想...我按以下顺序调用方法:

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(); 会有帮助吗?方法?我怀疑在移动网络有时间做出反应之前就抛出了错误,因为主线程没有“等待”这个任务完成。

4

2 回答 2

1

OK 问题三天后解决!:)

源没问题,PHP 没问题,服务器设置也没问题,除了 Galaxy 选项卡上的默认设置用于连接互联网外,一切都很好。ISP 设置代理(当然是为了嗅探我们普通人正在做的事情)阻止了 PHP 的响应,因此没有收到任何答复。删除代理后,一切正常。

感谢@forgivegod 和@chrkad,他们帮助了我,让我了解了更多关于众多Java 类和设置的知识。:)

干杯:)

于 2013-03-29T11:54:49.793 回答
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);
于 2013-03-28T18:19:54.103 回答