我创建的超级基本应用程序遇到了一些非常晦涩的问题。
应用程序纲要:
- 主活动 - 显示一个登录屏幕,应用程序将用户名和密码提交给 api。完成后,将发送意图以开始下一个活动
- 下载活动 - 此活动从服务器下载一堆文件并将它们放在下载文件夹中以供以后使用。一旦所有下载完成,就会发送另一个意图来开始第三个也是最后一个活动。此活动显示文件下载的进度条。
- Web 视图活动 - 此活动启动并启动 Runnable。此可运行对象旨在调用一个函数,然后在 5 分钟后重新运行自身,直至无限。它运行的函数在布局中创建一个 WebView(该布局有一个使用的容器布局,因此我们可以每次动态创建 webview)。一个基本的 HTML 页面(在 Downloads 文件夹中)被加载到 Web 视图中。
所以,我启动了这个应用程序,它开始工作没有问题。HTML 文件已加载,我离开了办公室。
今天早上我回到应用程序,Web View 不可见,登录屏幕(第一个活动的视图,在屏幕上。
我退出了应用程序并检查了我用来记录 logcat 的应用程序。它显示 Runnable 每 1-2 分钟发射一次,而不是 5 次(300,000 毫秒)。诡异的。
所以我浏览了大约 12 个小时的 logcat,每隔几分钟就会启动一次可运行文件(同样,应该是 5 个!)。没有应用程序失败的迹象。
Web 视图是否有可能正在运行,但在第一个活动的布局“下方”?如果是这样,是什么原因造成的?
下面是我的 Web View Activity 代码:
public class WebViewActivity extends Activity {
Timer autoUpdate;
Handler handler = new Handler();
Handler webHandler = new Handler();
Intent intent;
ArrayList<String> advertArray;
ProgressDialog pd;
File playlistFile;
File path;
File adFile;
private int currentIndex = 0;
private LinearLayout webContainer;
private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("MYAPP", "Starting WebViewActivity");
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_webview);
webContainer = (LinearLayout) findViewById(R.id.webviewContainer);
handler.postDelayed(runnable, 0);
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.i("runnable", "loadHTML");
loadHtml();
handler.postDelayed(this, 600000);
}
};
private void loadHtml() {
intent = getIntent();
advertArray = (ArrayList<String>)intent.getSerializableExtra("adverts");
Log.i("advert array size", ""+advertArray.size());
Log.d("main", "ACTIVITY ONCREATE");
webView = new WebView(this);
webView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
webContainer.removeAllViews();
webContainer.addView(webView);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setAppCacheEnabled(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setRenderPriority(RenderPriority.HIGH);
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/files");
String index = advertArray.get(currentIndex);
Log.i("advert array index", index);
adFile = new File(path + "/" + index + "/index.html");
webView.loadUrl("file:///" + adFile.getAbsolutePath());
}
}