我注意到有时Async任务无法正常运行,实际上它的doInBackground()方法没有被调用,这种情况主要发生在该活动在后台运行任何服务时。

例如,当音乐在带有服务的后台运行时,Async任务不会在后台解析XML,因为它的doInBackground当时不起作用,并且进度Dialog或progressBar一直旋转。

我读过几篇文章,AsyncTask.THREAD_POOL_EXECUTOR可以帮助解决以下问题:

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {

new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

} else {

new Test().execute();

}

但这对我的情况没有帮助。在上述实施后存在相同的问题。

在这里,我仅提供一些示例代码来了解我在做什么:

public class TestAct extends Activity {

ImageButton play,forward,backward;

private ListView mList;

// many more variables

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.test_layout);

//binding the service here

// start service is called

init();

}

private void init(){

play=(ImageButton)findViewById(R.id.playBtn);

forward=(ImageButton)findViewById(R.id.forward);

backward=(ImageButton)findViewById(R.id.backward);

mList=(ListView)findViewById(R.id.list);

new GetData().execute();

play.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// calling the play() method of ServiceConnection here

}

});

// adding header to Listview

// other code and click listeners

}

class GetData extends AsyncTask{

@Override

protected void onPreExecute() {

super.onPreExecute();

// starting the progress Bar

// initializing the Arraylist,Maps etc

}

@Override

protected Void doInBackground(Void... params) {

//parsing the XML here

return null;

}

@Override

protected void onPostExecute(Void result) {

super.onPostExecute(result);

// stop the ProgressBar

// Updating my UI here

// setting Adapter for ListView

}

}

}

通常,此方法运行良好,但在Service在背景音乐中运行时挂起(我的意思是在播放音乐时)。

我没有得到这个异步任务问题背后的确切原因。

在这种情况下,手动线程实现会有所帮助吗?

好吧,我认为问题是因为" Service在主线程中运行,因此当它运行时,它会阻止我的AsyncTask运行"。因此,我认为,如果我们可以在后台线程中运行Service,那将有所帮助。这就是为什么我尝试使用IntentService在单独的线程中运行服务,但我对此表示怀疑……如果IntentService可以像Service一样无限期地运行,并且IntentService也会阻塞AsyncTask几次。

因此,我认为它不能100%完美地解决此类问题。

谁能帮助我解决此问题并了解完整的情况。

提前致谢。

您要扩展Service还是IntentService

我正在使用服务在后台播放音乐

异步任务应该工作。你在某个地方犯了错误。

我非常确定我在实现Asynctask时没有犯任何错误,因为通常情况下(在大多数情况下)它可以正常工作,但是当音乐在后台播放时,progressBar会不断旋转。一件事,我在onResume()方法中调用AsyncTask,因为每次活动进入前台时我都需要刷新数据。它会影响AsyncTask的性能吗。我不这样认为,但请告知是否存在任何问题。

服务将在主线程中运行。因此请尝试使用IntentService而不是Service,因为IntentService将在单独的线程中运行

使用IntentService代替服务会影响我的应用程序的性能吗?因为我正在使用bindService播放音乐,也使用.aidl,所以要使用IntentService而不是Service,我是否需要在Current Service类中进行其他更改,或者可以继续使用同一类,只需将基本Service类替换为IntentService ..?

不,我认为这不会降低性能。请参阅IntentService上的一些示例

好的,但是由于我在Binder中使用服务,所以我认为IntentService不可能做到这一点!

在弹出进度栏并启动AsyncTask的地方显示代码。

@yorkw我已经更新了我的代码,请对其进行检查,如果我在此代码中犯了一些错误,请告诉我。

您在说什么音乐播放器?是你写的吗?

@JustinBreitfeller是的,当用户从歌曲列表中选择任何歌曲时,我正在后台播放音乐。

您如何播放音乐?您是否正在使用长期运行的AsyncTask?

尝试将android:process =":remote"添加到服务中,并检查是否调用了asynctask,如果您在其他进程中运行服务,则可能不会出现这种情况

有时,与IntentService相比,您可能希望对服务的生命周期有更多的控制,在这种情况下,您只需在服务中创建线程并在其中运行后台代码即可。实际上,更具体地说,创建一个包含Looper的HandlerThread,以便您可以使用标准android方法在主线程和后台线程之间进行通信(消息)。

在这里回答

这是一个提示,我如何最终解决我的问题::

1)我使用IntentService而不是Service,因为Service在mainThread中运行,而IntentService在与mainThread不同的单独线程中运行,以确保后台Service不会影响当前任务。 另外,我正在使用AIDL在我的UI和后台线程之间进行通信(该服务已经在Service上工作了,所以本部分没有新内容)。

2)我使用了无痛线程而不是AsyncTask,我在onDestroy()方法中中断了该线程,以确保该线程确实无限期地继续。

应用程序的性能似乎比现在早得多。

希望这也会对其他人有所帮助:)

这不公平。 人们提出了所有解决方案…

@ user1521536:您说的很对,人们向我提出了解决方案,但是没有一个解决方案包含了我所应用的两个解决方案提示,因此只是为了帮助其他人,我将它们组合在一起以获得更好的解决方案。

I noticed that sometimes Async task does not work properly , Actually

its doInBackground() method does not get called , this happens mostly

您知道一次只能执行AsyncTasks的限制吗?我曾经遇到一个任务无法正常启动/正常工作的问题,这是因为我超过了这个数字。检查Android AsyncTask线程限制?有关该主题的更多信息。

when any service run in background for that activity. For Example ,

when music runs in background with service, the Async task does not

parse XML in background as its doInBackground does not work that time

and the progress Dialog or progressBar kept spinning.

您是否检查了死锁的可能性(特别是如果使用的是wait()和notify())?

Well, I think the problem is because"Service runs in main thread so

when it runs, it blocks my AsyncTask to run"... So I think If we can

run Service in background thread then that can help . Thats why I

无论如何,您将要在服务中执行的操作应在自己的线程中运行。这样,您可以确定什么都不会被阻塞。例如,如果您要填充一些东西,可以使用接收器。

希望我能有所帮助...

阅读这里发布的所有问题和答案。纠正我,如果我错了,您的情况是您正在解析xml并获取歌曲列表,并且当用户选择任何要使用服务播放的歌曲时正确吗?

如果方案是正确的,那么我们可以以更简单的方式实施它。

在"活动"中,onResume()方法解析XML文件并获取歌曲列表并更新列表视图(此处不启动与服务相关的任何操作)

当用户单击歌曲,然后有意地将特定的键/字符串传递给服务并启动服务

与常规媒体API一样,在服务的OnStartCommand()方法中获取标识符并开始播放歌曲

这实际上将为您完成工作。

关于问题

if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {

new Test().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

} else {

new Test().execute();

}

这是针对AsyncTask在不同版本的Android上的不同行为。

查看您的代码,在Activity中,您正在初始化服务,因此该服务在后台运行,而没有做任何有成果的事情。

当用户单击播放时,您将在此处调用服务的播放功能,从而造成问题。

因此要从Activity调用服务功能,您应该纠正未提及的AIDL。如果您已经写过,那应该是完美的。

但是这里的建议是将歌曲ID传递给服务,并且应该从服务中播放,而不应该在活动中调用服务的功能。

如果要在活动的onResume中更新歌曲列表,则必须编写AIDL并完成方案

希望这会有所帮助。

谢谢你的宝贵建议,但是我已经使用IntentService而不是Service来实现,并且用Painless线程代替了Async任务,并且效果很好:)

我已经在测试项目中实现了您的方案。 因此,您甚至可以使用AIDL。 如果您发现ans pls接受任何一个ans。

我认为问题是在上一个完成之前开始另一个GetData AsyncTask。在执行另一任务之前,请确保先前的任务已完成。为此,请使用以下代码:

// make sure we don't collide with another pending AsyncTask

if (getDataTask == null || getDataTask.getStatus() == AsyncTask.Status.FINISHED || getDataTask.isCancelled()) {

getDataTask= new GetData();

getDataTask.execute();

}

另外,请确保您具有运行任务的参考。您可以在应用程序运行时使用Application类的子类来执行此操作,或者覆盖onSaveInstanceState(Bundle outState)

并在onCreate(Bundle savedInstanceState)中收到对其的引用。

根据Android开发人员AsyncTask文档的"线程规则"部分,必须在UI线程上创建并启动AsyncTask,因此,如果从Service中的后台线程启动AsyncTask,则可能会导致错误行为。

http://developer.android.com/reference/android/os/AsyncTask.html

对于投票否决的人,我是否可以要求澄清为何投票? 据我对用户问题的理解,除非我只是用后台线程或IntentService误插入有关Service的底层语句,否则他是在intent服务中启动该服务的,因此不会在UI线程上运行。

通常,您真的不应该使用AsyncTasks :)这里有一个很好的解释。想一想,如果用户在任务运行时旋转设备,将会发生什么情况。重新创建了活动,但任务在后台运行,并保留了对"旧"活动的引用。有多种方法可以解决此问题,并且肯定在某些情况下AsyncTasks是正确的方法。

但是,您确实应该考虑切换到装载机,或者(如果您喜欢冒险的话)尝试RoboSpice :)

android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...相关推荐

  1. android 后台执行js,android - 当应用程序在后台运行时,Android WebView消耗大量电能...

    我的Android应用程序中有一个WebView,并且此WebView运行的网站上带有相当多的Javascript.当我的应用程序在后台运行时,用户报告了高功耗,我希望这是由于此javascript. ...

  2. android极光推送在app开启后,在ios上,app后台运行时,如何在极光消息推送过来时,运行一段自定义的代码(请求,语音播报等)...

    通常情况下,app在ios上后台运行时,发送的推送无法被app监听,并执行自定义操作. 这个时候,需要发起Remote Notifications(ios7开始支持后台) ios7和ios6对比: 可 ...

  3. android将引入aot编译器,Android N混合使用AOT编译,解释和JIT三种运行时

    Android N引入了我们一种主要包含编译.解释和JIT(Just In Time)的混合系统运行时,以便在安装工作时间.内存占用.电池材料消耗和性能指标之间可以获得发展最好的折衷. ART在And ...

  4. android 解决APP退出后以及后台运行时,再次点击图标的运行问题

    需求:现有闪屏界面SplashActivity,要求在无后台运行APP的情况下,点开应用,首先出现闪屏,2秒过后,进入到主功能界面MianActivity,运行时,将APP关至后台,再次点击图标,返回 ...

  5. python异步线程算法应用_Python多线程----线程池以及线程实现异步任务

    了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...

  6. android 程序运行不了,当应用程序在后台运行或不运行时,Android – 推送通知工作不正确...

    我使用Firebase Cloud Messaging发送推送通知. 这是我的FirebaseMessageService: public class FireBaseMessageService e ...

  7. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  8. ART运行时Semi-Space(SS)和Generational Semi-Space(GSS)GC执行过程分析

    Semi-Space(SS)GC和Generational Semi-Space(GSS)GC是ART运行时引进的两个Compacting GC.它们的共同特点是都具有一个From Space和一个T ...

  9. android异步线程利用Handler将消息发送至UI线程

    android UI线程安全 首先对于android而言,UI线程就是我们的主线程,在Android应用启动时,会自动创建一个线程,主线程负责UI的展示.UI事件消息的派发处理等等,因此主线程也叫做U ...

最新文章

  1. MySQL数据类型--------字符串类型实战
  2. @vail 判断某字段在范围内_月经两三天就没了和五天以上才没有,哪个更好?怎么判断月经量...
  3. 巧用watch命令执行循环操作,来解放我们的双手
  4. 【转载】adb shell dumpsys 查看内存
  5. svn拉取文件合并_四、Jenkins+SVN拉取文件下发
  6. 插件怎么用_PPT插件怎么用?用好了10s就能给出一个动画特效,不好看不要钱
  7. C++是C语言演变过来的,为何不能代替C语言?
  8. java环境配置:安装jdk和集成开发环境
  9. 创业公司如何构建数据指标体系?
  10. 漫谈工业软件(2)-IEC61499标准
  11. 【毕业设计】基于单片机的太空游戏机 - 嵌入式 物联网 stm32 51
  12. Youtube CC字幕是什么,Caption和Subtitle的解释
  13. win10微信卡顿_电脑一分钟小技巧:win10微信电脑端多开方法
  14. ios学习之模仿韩寒one.一个UI
  15. [机器学习与数据分析] 数据分析常用方法
  16. 壁纸小程序源码双端微信抖音小程序
  17. 编写程序描述影视歌三栖艺人 需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。 实现思路及关键代码 1)分析影视歌三栖艺人的特性 a)可以演电影 b)可以演电视剧 c)可以唱歌
  18. The bean ‘employServiceImpl‘ could not be injected as a ‘com.itcast.reggie.service.impl.EmployServic
  19. java基于微信小程序的共享单车电动车租赁系统 uniapp 小程序
  20. 嵌入式主板广泛的解决方案

热门文章

  1. Web内核微信小程序框架实践
  2. 1024程序猿节:致敬改变世界的你
  3. 世界正在走向实时化,谈谈Twitter对流处理的理解与思考
  4. c++协程2 (boost::coroutine)
  5. go WaitGroup 简单示例
  6. win7 VS2008 编译luabind-0.9.1 动态库 静态库
  7. Elasticsearch 实例管理在京东的使用场景及演进之路
  8. 最快解决在win下杀死端口号的方式
  9. 手绘风格的数据可视化 (萌萌风)Sketchify,及其他可视化工具(商业风)
  10. leetcode 816. Ambiguous Coordinates | 816. 模糊坐标(Java)