有人可以告诉我他们是否在我的代码上看到错误。
我创建了一个HTML5网站(多个页面,和JS文件),我想成为Android应用程序的一部分,每次我在我的虚拟设备上运行它我得到一条消息不幸的是AppName没有响应或停止响应( WAIT / CLOSE)。我已经查看了我的MainActivity代码,但无法查看错误。
我的控制台中没有任何错误,我的LogCat没有错误。
我的代码应该将文件从assets文件夹复制到sdcard,然后使用webView打开index.html文件
MainActivity.java(代码)
package com.example.html5;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.res.AssetManager;
import android.util.Log;
import android.view.Menu;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
private WebView mWebView;
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
copyAssets("ErgonomicsHelp");
mWebView = (WebView) findViewById(R.id.activity_main_webview);
// Enable Javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Force links and redirects to open in the WebView instead of in a browser
mWebView.setWebViewClient(new WebViewClient());
mWebView.loadUrl("file:/data/data/com.example.html5/ErgonomicsHelp/data/index.html");
}
@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;
}
private void copyAssets(String path)
{
String[] files = null;
try
{
files = getAssets().list(path);
} catch (IOException e)
{
e.printStackTrace();
}
if (files.length == 0)
copyFile(path);
else
{
File dir = new File(getExternalFilesDir(null), path);
if (!dir.exists())
dir.mkdir();
for (int i = 0; i < files.length; i++)
{
copyAssets(path + "/" + files[i]);
}
}
}
private void copyFile(String filename)
{
InputStream in = null;
File file;
OutputStream out = null;
try
{
in = getAssets().open(filename);
} catch (IOException e)
{
Log.e(TAG, "ERROR WITH in = getAssets().open: " + filename);
e.printStackTrace();
}
file = new File(getExternalFilesDir(null), filename);
try
{
out = new FileOutputStream(file);
} catch (FileNotFoundException e)
{
Log.e(TAG, "ERROR WITH out = new FileOutputStream(file);");
e.printStackTrace();
}
byte[] data;
try
{
data = new byte[in.available()];
in.read(data);
out.write(data);
in.close();
out.close();
} catch (IOException e1)
{
e1.printStackTrace();
}}
}
任何建议将不胜感激。 真诚的,德里克
- 已编辑 - 2014年5月24日 -
我发生了一件我无法解释的事情。
我打包应用程序并在我的设备上运行它,副本集工作正常,文件已创建。我调整了我的代码
mWebView.loadUrl("file:/mnt/sdcard/android/data/com.example.html5/ErgonomicsHelp/data/index.html");
应用程序安装正常,但应用程序无法启动,我唯一可以使其工作的方法是使用我的文件管理器应用程序直接导航到文件夹,在index.html文件上选项卡并使用&#打开34; HTML Viewer&#34; (文件夹和齿轮的图像)。
任何人都知道为什么会发生这种情况
答案 0 :(得分:2)
你在主UI线程中复制了一堆文件,这在Android上绝对是“不”。您需要学习如何使用AsyncTask执行任何耗时的操作,否则您将继续获得这些错误。
以下是一篇关于如何执行此操作的好博客:http://android.programmerguru.com/what-is-asynctask-in-android/
答案 1 :(得分:0)
谢谢Oleg。
我解决了。
我改变了我的代码:
mWebView.setWebViewClient(new WebViewClient());
to - 我应该使用.setWebChromeClient
mWebView.setWebChromeClient(new WebChromeClient());
并将我的文件位置更改为:
mWebView.loadUrl("file:/mnt/sdcard/android/data/com.example.html5/files/ErgonomicsHelp/index.html");
现在它正在WebView中完整地打开并运行我的HTML5网站。 注意: 即使这样也解决了我的问题我不是一个经验丰富的程序员,我相信他们是按照Oleg post的建议更有效的方式来编写应用程序。