具有 Web 服务调用的 Html5 应用程序可在模拟器上运行,但不能在设备上运行

Posted

技术标签:

【中文标题】具有 Web 服务调用的 Html5 应用程序可在模拟器上运行,但不能在设备上运行【英文标题】:Html5 app with web service calling works on emulator but not on device 【发布时间】:2014-04-07 10:58:53 【问题描述】:

我使用 javascripthtml5 中开发了一个应用程序。我已经使用 json 调用了 php web 服务。 现在正在尝试为 android 执行它。

应用程序在模拟器上与 Web 服务配合良好,但无法从设备上的服务器加载文本和图像。

我尝试了许多在 *** 和其他链接上找到的解决方案,例如使用主机名、检查设备的 wifi、清单文件中的 INTERNET 权限、使用 WebView,但它不起作用。

请帮忙。

//这是我在eclipse中所做的。

public class MainActivity extends DroidGap 

    WebView webview;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("hello","start");

        webview = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webview.setWebChromeClient(new WebChromeClient());

        webview.loadUrl("file:///android_asset/www/HTML/index.html");
        Log.d("After load", "url");

    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    


获取图像和文本都是在 javascript 中完成的。它在浏览器和模拟器上都没有问题。但它在设备上失败了。

//这是我的json调用函数。

<script>
    function jsondata(data)
    
        setTimeout(function () 
         var parsedata = JSON.parse(JSON.stringify(data));
         var main_category = parsedata["mainCategory"];

            for (var i = 0; i < main_category.length; i++) 
            
                var menu = main_category[i];
                menu_id=menu['mcatid'];         

                var id = document.createElement("table");   

                if((i%2)==0)
                

                   id.innerHTML+='<br><br><br><td><a href="#" onclick="selected_index('+menu_id+')"><img src='+menu['mcatimage']+'><br><hr color=#000;>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font face="DEVROYE">'+menu['mcattitle']+'<hr color=#000;></a></td></strong>';
                  document.getElementById("id_left").appendChild(id);
                
                else
                

                   id.innerHTML+='<br><br><br><tr><td><a href="#" onclick="selected_index('+menu_id+')"><img src='+menu['mcatimage']+'><br><hr color=#000;>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font face="DEVROYE">'+menu['mcattitle']+'<hr color=#000;></a></td></strong>';
                   document.getElementById("id_right").appendChild(id);
                   
            
            , 2000); 
     

    /*-------------calling web service-----------*/
    jsonp("http://hostname/maincategory.php?callback=jsondata");
</script>

这是我从 Web 服务获取图像和文本并显示在 HTML 页面上的方法。 这有什么问题?

今天我尝试了很多事情,例如将 &lt;access origin="*"/&gt; 更改为 &lt;access origin=".*"/&gt;&lt;access origin="http:hostname"/&gt; 但没有任何效果。

【问题讨论】:

这真的很难说,因为您没有发布任何内容告诉我们您如何加载图像或文本。贴一些示例代码。 U 在 android 浏览器(本机)上将其加载为 file://,并在 diff 域上调用 ajax,这将是跨域的。 (原生 webview 浏览器对安全性比直接浏览器更严格)。 @Neha 我的 html 文件存储在 www 目录内的 assets 文件夹中,因此正在加载 url 文件:/// 并且我的域在 javascript 代码中被调用,我在其中进行数据的实际处理.在 android 的 logcat 中,它显示 url 已加载,但我没有获取数据。我检查并重复了将 HTML 应用程序转换为 android 的所有步骤,但没有任何效果。我的项目卡在这一点上。请给我一些建议。 这听起来很奇怪,但是在添加时间延迟时它可以在模拟器上工作,但现在同一个文件也不能在模拟器上工作。 覆盖 android webview 的 webclient 并在 onerror 和 onload 资源处查看问题所在..或 url 是否正在加载.. 【参考方案1】:

我的应用程序现在也可以在设备上运行。

从安卓端没有问题。我在 javascript 中使用 ajax 而不是 json。它也开始在设备上高效工作。

【讨论】:

以上是关于具有 Web 服务调用的 Html5 应用程序可在模拟器上运行,但不能在设备上运行的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 应用程序缓存

允许 HTML5 Web 应用在浏览器未聚焦时访问位置 (iOS)

HTML5-离线缓存(Application Cache)

HTML5 应用程序缓存

H5 缓存机制浅析 移动端 Web 加载性能优化

HTML5 应用程序缓存