我正在开发一个带有多个标签的android应用程序。我的标签有以下内容。
第一个标签 - 显示网格视图中杂志的存档。目的是当我点击网格视图项时,我需要从网站下载一个大文件。为此,我创建了一个具有ASYNC任务的服务,该任务将下载该文件。我已经展示了代码。
public class DownloadArchivesService extends BaseService {
private static final String TAG = "DownloadArchivesServices";
private static final String STOP = "stop_modificator";
public static final String ALREADY_RUNNING= "DownloadArchivesService_Already_Running";
public static final String ARCHIVES_PERCENTAGE_PROGRESS ="Archives_Percentage_Progress";
public static final String UPDATE_ARCHIVES_PROGRESS = "Update_Archives_Progress";
@Override
public void onCreate() {
getPreferences().edit().putBoolean(ALREADY_RUNNING, true).commit();
application = (JfwApplication)this.getApplicationContext();
context = this;
session = application.getSession();
calendar = Calendar.getInstance();
dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
magazineManager = new MagazineManager(this);
//magazine = new Magazine(fileName, fileName, "", "", this);
new AsyncTask<String, Integer, String>() {
NumberFormat formater = NumberFormat.getPercentInstance(Locale.getDefault());
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
// I do my download here }
@Override
protected void onProgressUpdate(Integer... p) {
if (isCancelled()) {
return;
}
//I udpate my progress bar here }
@Override
protected void onPostExecute(String result) {
Intent intentInvalidate = new Intent(ArchivesActivity.GRID_INVALIDATE);
sendBroadcast(intentInvalidate);
super.onPostExecute(result);
}
}.execute();
super.onCreate();
}
当我导航到第二个标签页时,我需要从网站上下载一些照片并将其显示在屏幕上。我编写了类似上面的服务 - DownloadImagesService。
但问题是当上面提到的DownloadArchivesService正在运行时(即,当我有 点击网格视图项以调用DownloadArchivesService并导航到第二个选项卡以下载照片,不调用DownloadImageService(下载照片的服务)并等待DownloadArchivesService完成。这将使用户在第一个服务完成之前等待一段时间。我知道服务将在主线程中运行,一个服务需要等待已执行的服务执行。 有没有办法同时运行不同的服务(或后台任务),而无需等待以前优质的服务。
我确实浏览了有关服务,意图服务和线程的各种文档。但是我无法对andorid如何处理并发服务这个特殊的事情。
我非常感谢你提供任何帮助。如果我的解释不明确,请告诉我。
感谢。
答案 0 :(得分:5)
从Android 4.0 + AsyncTask
获得一个执行线程。因此,第二个AsyncTask
将在第一个完成后运行。
请参阅Multiple Async Task not running in android 4.1了解如何处理它们。
答案 1 :(得分:2)
AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。 从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
http://developer.android.com/reference/android/os/AsyncTask.html
我建议你为此目的使用遗嘱执行人
http://developer.android.com/reference/java/util/concurrent/Executor.html