gpt4 book ai didi

Android:如果 AsyncTask 初始化(文件下载)失败则关闭应用程序

转载 作者:行者123 更新时间:2023-11-29 20:25:37 24 4
gpt4 key购买 nike

每次用户启动应用程序时,都会发生一些初始化阶段,包括在 AsyncTask 中从网络下载文件。我需要在连接问题时监控启动应用程序的情况并处理它:

  1. 如果下载已开始但未完成 - 等待 3 秒,也许在此期间下载将完成 - 然后继续初始化过程。
  2. 如果 3 秒后下载仍未完成 - 关闭应用。
  3. 如果从一开始就没有开始下载 - 关闭应用程序。

我做了什么:

public class Initialisation extends Activity {

public boolean isDownloadStarted = false;
public boolean isDownloadFinished = false;

@Override
public void onCreate(Bundle saved) {
initFoo1();

new DownloadAsyncTask.execute(); //for the sake of simplicity assume it
takes “zero time” so if all OK it
should be ready in next line check
...
initFooN();
if (isDownloadFinished) {
//continue regular
}
//if download started and not finished maybe it’s just slow connection
//give 3 more seconds to succeed
else if (isDownloadStarted == true && isDownloadFinished == false) {
showProgressSpinner();
new SleepAsyncTask.execute();
}
//if download not started - Connection error - close App now
else if (!isDownloadStarted) {
exitProcess();
}
}

public class DownloadAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
public void doInBackground(Void… params) {
isDownloadStarted = true;
fooDownloadFile();
isDownloadFinished = true;
}
}

public class SleepAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
public void doInBackground(Void… params) {
Thread.sleep(3000);
}
@Override
public void onPostExecute(Void result) {
if (isDownloadFinished) {
dismissProgressSpinner();
//TODO: Do nothing - Should be continue regular?
}
//if even after 3 more seconds the download not finished - close the App
else {
exitProcess();
}
}
}

public void exitProcess() {
//TODO: Is it the right way?
this.finish();
System.exit(0);
}

}

我的问题是关于 TODO 的,总的来说 - 这种方法会成功吗?这是处理这种情况的好方法吗?

最佳答案

  1. 您在 2 个线程之间共享 bool 变量 - 访问它们时应提供一些同步。从理论上讲,AsyncTask 的线程会复制您的 bool 值,这种情况可能会导致意外满足或不满足 if 语句中的条件。在您的情况下,volatile 关键字应该会有所帮助。您可以在此处阅读更多相关信息 (http://www.javamex.com/tutorials/synchronization_volatile.shtml)。

  2. 你为什么要使用 AsyncTask? AsyncTasks 的主要问题之一是取消它们的作业。其次,它们经常导致应用程序内存泄漏。我建议使用 IntentService完成下载工作。

  3. 通过调用 System.exit(0),您告诉 VM 明确重启您的进程。这是理想的行为吗?

  4. 如果 3 秒后下载仍未完成 - 关闭应用。

好吧,我不确定您是否知道这一点,但在 Android HONEYCOMB 中,AsyncTasks 在未明确告知以并行方式运行时按顺序执行(http://developer.android.com/reference/android/os/AsyncTask.html - 执行顺序)。

这里是 IntentService 用法的例子 https://github.com/dawidgdanski/Bakery .如果下载不成功,要处理通知应用程序在 3 秒后退出的逻辑,请使用 Handler.postDelayed .对于 IntentService 和您的 Activity 之间的通信目的,请使用 BroadcastReceiver .

流程:

  1. 开始 Activity 。调用处理程序的 .postDelayed() 方法。启动服务。下载作业完成后,注册广播接收器以处理来自服务的广播。
  2. 当下载在等待超时前完成时,remove all callbacks from Handler
  3. 否则在超时Runnable中调用finish()方法。

希望有所帮助。

关于Android:如果 AsyncTask 初始化(文件下载)失败则关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com