场景:在我的应用程序中,当我单击按钮时,它将打开带有WebView的对话框,并加载一些数据(涉及在本地复制,编辑和加载HTML文件)。 WebView应该显示本地创建的HTML文件。
正在发生的事情:对话框需要很长时间才能打开。它至少等待文件复制和编辑部分。当WebView开始加载HTML文件时,该对话框打开。
我尝试过的事情: 我试过在主线程中调用它们:
url = prepareLocalHtmlFile(dataKey); //Copy and edit html file and returns its path in local dir
webView.loadUrl(url); //Show the html file in WebView
也在单独的线程中尝试过:
Thread mThread = new Thread() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
url = prepareLocalHtmlFile(dataKey); //Copy and edit html file and returns its path in local dir
webView.loadUrl(url); //Show the html file in WebView
}
});
}
};
mThread.start();
我想要的内容:我按下按钮后,对话框应立即打开,然后所有耗时的操作都将发生(在webView中复制,编辑,加载HTML)。请建议如何实现。
答案 0 :(得分:0)
尝试了更多之后,我终于找到了解决方案。使用AsyncTask
。
我创建了一个扩展AsyncTask
的类。
public class GenerateDataToDisplay extends AsyncTask<String, Integer, Boolean> {
private Context context;
private SQLiteDatabase appDb;
public GenerateDataToDisplay(Context context, SQLiteDatabase appDb){
this.context = context;
this.appDb = appDb;
}
@Override
protected Boolean doInBackground(String[] results) {
return results.length > 0 && generateDataToDisplay(context, appDb, results[0]);
}
}
然后按如下所示在调用对话框中执行此AsyncTask
:
new GenerateDataToDisplay(this, db)
{
@Override
public void onPostExecute(Boolean result) {
//Hide progress bar
progressBar.setVisibility(View.GONE);
//Display data
textView.setText("Got it!!!");
}
}.execute(inputKey);
通过此实现,对话框立即打开,显示进度条,开始数据加载(AsyncTask
)。数据准备就绪后,进度条将消失,并显示数据。
到目前为止,它对我来说还不错。如果您有更好的建议,请随时发表评论以添加另一个答案。