Android下载异步任务冻结我的应用程序很长一段时间



当我启动应用程序时,我只看到大约15秒的白色屏幕。我认为这是因为异步任务仍然试图在后台访问服务器,尽管它目前还没有联机。有什么方法可以解决用户收到消息说正在尝试连接到服务器或引入时间限制的问题吗?

我已经建立了这个,以便在应用程序开始时下载一个文件,如果数据库的最新版本大于下载AvailableDatabase((中下载的当前安装的数据库,则该文件将存储该数据库的最新版(我仍然需要做最后一个(。

以下是两个文件的重要部分:

MainActivity.java

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Initialization();
DataManager.Initialization(context);
}

DataManager.java

public static void Initialization(Context context){
try {
if (isNetworkAvailable(context)){
files_path = Objects.requireNonNull(context.getExternalFilesDir("")).toString();
IntegerDownloadTask integerDownloadTask = new IntegerDownloadTask();
Integer database_version = getDatabaseVersion(context);
Integer available_database_version = integerDownloadTask.execute(database_version_download_url).get();
if (database_version < available_database_version){
downloadAvailableDatabase();
}
}
} catch (Exception e){
Log.i("Error", e.toString());
}
}
private static Integer getDatabaseVersion(Context context){
File versionFile = new File(files_path, database_version_filename);
if(versionFile.exists()){
StringBuilder stringBuilder = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(versionFile));
String line;
while ((line = br.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append('n');
}
br.close();
return Integer.parseInt(stringBuilder.toString());
}
catch (Exception e) {
try {
FileOutputStream stream = new FileOutputStream(versionFile);
stream.write("0".getBytes());
stream.close();
} catch (Exception ignored){}
return 0;
}
} else {
try {
FileOutputStream stream = new FileOutputStream(versionFile);
stream.write("0".getBytes());
stream.close();
} catch (Exception ignored){}
return 0;
}
}
private static void downloadAvailableDatabase(){
}
private static boolean isNetworkAvailable(Context context) {
try {
ConnectivityManager connectivityManager
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert connectivityManager != null;
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
} catch (Exception e){
return false;
}
}

您可以在活动中添加progressBar在活动xml文件中添加以下代码:

<ProgressBar
android:id="@+id/simpleProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

然后在活动的OnCreate功能中初始化progressBar并将可见性设置为可见

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Initialization();
progressbar=findViewById(R.id.simpleProgressBar)
progressbar.setVisibility(View.VISIBLE)
DataManager.Initialization(context);
}

然后在异步任务中,将progressBar的可见性设置为onPostExecute方法

相关内容

  • 没有找到相关文章

最新更新