1

在我的应用程序中,我可以访问 Web 服务器。它在某些手机中运行良好,但在三星 Galaxy 型号 - GT-S5830i Android 版本 - 2.3.6中进行测试时, 它一直显示未知主机异常。我已经检查了浏览器中的 url 它工作正常。

private void submitUploadData(String url ,Map<String, String> param) throws IOException 
{  
    URL siteUrl;
    try {
        siteUrl = new URL(url); 
    HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    conn.setDoInput(true);

    DataOutputStream out = new DataOutputStream(conn.getOutputStream());

    Set getkey = param.keySet();
    Iterator keyIter = getkey.iterator();
    String content = "";
    for(int i=0; keyIter.hasNext(); i++) {
        Object key = keyIter.next();
        if(i!=0) {
            content += "&";
        }
        content += key + "=" +  param.get(key);
    } 
    out.writeBytes(content.trim()); 
    out.flush();
    out.close();
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    String line = "";
    while((line=in.readLine())!=null) {
        System.out.println(line);
    }
    in.close();  
    //Intent home = new Intent(SyncHttp.this,TimeAndExpensesSKActivity.class);
    //startActivity(home);
    db.updateTimeExported(1);
    db.updateExpensesExported(1);
    db.close();
    db.close(); 

    if(db.getLogCount()==0){ 
            db.insertSyncDateDetails(getDateandTime());}
            else{
            db.updateSyncDateDetails(1, getDateandTime());}  


    } catch (MalformedURLException e) { 
        e.printStackTrace();
    }
    this.setResult(FINISH_RESULT);
    db.close();
}

我已经添加了权限

 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.CAMERA" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

我真的很困惑为什么会发生这种异常。

谢谢你们的帮助。

4

4 回答 4

1

我在三星 Galaxy TAB 上使用 URLConnections 尤其是 HTTPS 时也遇到了一些问题,但我想它也可能发生在其他型号上,因为有大量同名的设备是为不同的市场和移动提供商制造的。

到目前为止,我还没有找到解决办法,因为我倾向于避免使用 URLConnection 类,因为它有很多其他问题。

我建议使用 Apache HTTP 客户端与您的 API 进行通信。你可以在谷歌上搜索大量使用它的例子。

另外,在查看您的代码时,我建议您对 java 中的 try-catch-finally 块语句进行更多阅读。在最后或出现错误时正确关闭连接非常重要。

其他可能性是:

  1. 没有任何活动的连接(移动或wifi)

  2. 您缺少“http://www”。在您的网址中。

于 2012-06-12T13:23:24.563 回答
1

我的应用程序也这样做了。这通常是由于网络连接不稳定造成的。我所做的就是抓住这个UnknownHostException并修改代码,如果UnknownHostException发生这种情况,我会在几毫秒的睡眠后再次尝试重新获取 URL。

基本算法是这样的:

private void submitUploadData(String url ,Map<String, String> param) throws IOException 
{  
    URL siteUrl;
    boolean isDataSubmitted = false;
    while(!isDataSubmitted){
        try {
            //do your complicated http process
            isDataSubmitted = true;
        } catch(UnknownHostException uhe){
            e.printStackTrace();
        } catch (MalformedURLException e) { 
            e.printStackTrace();
        }
    }
}
于 2012-06-12T13:23:31.780 回答
0

我认为在收到输入之前在 DataOutputStream 上调用 close() 可能会关闭整个连接 - 尝试注释掉该行。

于 2012-06-12T13:24:33.817 回答
-1

您是否检查过手机浏览器中的 URL?请记录您传递给函数的 URL,然后在手机的浏览器中尝试。我会想到缺少/不正确的协议说明符和/或 URL 字符串形成问题,这个特定的电话是不可原谅的。

于 2012-06-12T13:21:38.207 回答