Articles of multithreading

当我使用带有ResultReceiver的IntentService时,我的Activity被销毁时会发生什么

我通过网络搜索了这个答案。 但没有find结果。 对不起,我是Java和Android编程的新手。 我会更详细地阐述我的问题。 假设我的Activity启动了一个IntentService,它在后台独立运行。 该服务“订阅”到ResultReceiver的回调以更新活动UI。 并且在服务执行长时间运行的过程中,Activity被销毁。 那么,如果服务通过ResultReceiver向活动发送回复或进度更新,会发生什么? 因为我知道,ResultReceiver需要有一个Activity的引用。 在我的项目中,我需要开发一个video剪辑消息应用程序。 当用户捕获video时,它会将数据传递给服务,服务将执行上传以及将一些信息保存到db ..同时继续通过ResultReceiver将进度更新发布到活动UI。 用户可以根据需要退出或终止活动。 但是当他们导航回应用程序/活动时,如果上传/下载仍在进行中,则需要显示当前进度。 最初我想到了Asynctask,但它也有类似我提到的问题。 它需要调用者Activity的引用。 有没有我能达到我提到的要求的地方? 对不起,很长的post。 希望有人可以启发我一点,有一些代码片段甚至更好。 非常感谢 :) 编辑:简而言之,有没有办法将新创建的Activity动态绑定到正在运行的IntentService,以便服务可以将进度更新发送到正确的Activity?

Android – 暂停所有线程:* ms

即使在我离开应用程序一段时间后,我在我的logcat中也有这些警告。 (虽然没有杀死,只是按回来离开它。) 05-03 13:43:42.955 13047-13053/package W/art: Suspending all threads took: 7.873ms 05-03 13:44:32.458 13047-13053/package W/art: Suspending all threads took: 13.441ms 05-03 13:46:58.584 13047-13053/package W/art: Suspending all threads took: 34.462ms 05-03 13:47:00.574 13047-13053/package W/art: Suspending all threads took: 8.281ms 05-03 13:48:00.425 13047-13053/package W/art: Suspending all threads took: 25.929ms 05-03 13:48:16.019 13047-13053/package W/art: Suspending all threads took: […]

取消长轮循环的并发问题

我有一个问题,我希望我会通过写这个问题来解决,但如果没有,我会发帖,看看是否有人可以提供帮助。 我正在使用一个客户端库(我感觉编写得很糟糕)与使用COMET样式的长时间轮询HTTP的实时聊天服务器进行交互。 我在某些情况下遇到了取消长轮询的问题,并怀疑我可能需要添加一些并发处理代码,但由于以下原因,我发现很难find最佳方法。 订阅代码 (在长轮询中)实现为具有以下内容的大循环 doLongPoll() { while(true) } //IF channel field boolean unsubscribe == TRUE, if so BREAK; //perform GET request (and store channel HTTPClient used for this call) //remove HTTPClient used for this call //IF channel field boolean unsubscribe == true, if so BREAK; //IF connection problem sleep(1500) then CONTINUE //post received data […]

当服务在后台运行Android时,异步任务无法正常工作(doInBackground不执行)

我注意到有时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(); […]

线程优先级 – ‘unit testing’

一个非常简洁的问题: 如何通过简单的测试来certificate,该设置: android.os.Process.setThreadPriority(int); 实际上有效? 我发布这个问题的原因主要是通用的,因为我找不到一个可以复制的简单测试。 进一步阅读: 这对我和我的应用程序来说非常重要,因为它捕获了必须优先考虑的音频。 音频数据也被写入文件以及被分析其属性,这不太重要 – 因此我不要求这些任务“真正同时”。 在我的音频线程中,我设置: Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); 我可以通过前后检查简单地测试上面的’应用’: Process.getThreadPriority(Process.myTid()); 但是,我对测试的需求是由于文档, 其中指出 : 最重要的音频线程的标准优先级。 应用程序通常无法更改为此优先级。 尽管日志输出显示优先级已更改为-19,但我在文档中的措辞引起的担忧是,系统在执行时可能不允许正常应用程序的值为-19,并且可能保留为仅限系统应用? 如果上述情况属实,我想知道如何简单地certificate这个优先级值会发生什么 – 它是否默认为允许的最大值,还是可以完全忽略? 关于实际测试本身,我已经尝试了循环和暂停,但没有成功,我不相信我所做的尝试的结果。 我也知道这种行为是依赖于操作系统的,所以也许我无法复制一个独立的Java测试,但我没有find任何支持的例子 ? 希望有人能提供帮助。 提前致谢。 编辑 – 除了最初的答案,我很欣赏这种行为可能不是我想要或期望的。 我想要对此进行实际的物理测试 ,而不是对可能性的解释。 测试将包含多个运行不同优先级的线程以及它们在打印到日志时完成的顺序,没有比这更复杂的了。 我的尝试似乎过于复杂,因此我在这里寻求帮助。

由于异步Firebase调用,主线程做了太多工作?

我的应用程序上一直出现错误,上面写着I/Choreographer: Skipped 252 frames! The application may be doing too much work on its main thread. I/Choreographer: Skipped 252 frames! The application may be doing too much work on its main thread. 我认为这会导致我的UI出现一些滞后,这是我不想要的。 我认为这是因为当我执行Firebase查询时,当我执行onDataChange() ,它似乎总是在主UI线程中执行。 我有大约5个类似于以下内容的Firebase查询。 因此,我尝试将我的代码从onDataChange()方法移动到AsyncTask并更新AsyncTask onPostExecute()方法上的UI线程。 但是,当我尝试这个时, onPostExecute()方法永远不会完成。 这是我的尝试: public void getPublicPosts(final View progressOverlay, final View fragmentView, final Context context) { //Need to […]

在Android中线程化

我目前正在开发Android应用程序,它需要从互联网下载内容。 我使用线程来做,然后调用runOnUiThread方法来更新GUI。 我在其上放置了一个刷新菜单,如果用户尝试刷新内容,则会创建并启动下载线程。 问题是我如何控制线程顺序,我需要接受最新请求的响应并放弃先前的线程请求,如果还有其他请求仍在运行,因为请求参数可能已被用户更改。 目前我正在使用threadId来做这件事,当一个线程完成时,它将检查它的threadId,如果它是最新的一个,它然后接受控制并呈现响应。 我的问题是,还有其他适当的更好的解决方案吗? 用户退出应用程序时是否需要停止线程? 我记得有些书说不要手动尝试停止线程并等待自己完成是一个很好的做法,是真的吗? 我应该通过调用“停止”或“中断”方法来阻止它们吗? 我在Android中阅读了一些围绕线程的文档并发现了HandlerThread类,它是什么? 在什么样的情况下我需要使用它?

同时访问Java中同一对象的不同成员

我熟悉Java中关于并发的许多机制和习惯用法。 我困惑的地方是一个简单的概念:同一对象的不同成员的并发访问。 我有一组可以由两个线程访问的variables,在这种情况下涉及游戏引擎中的图形信息。 我需要能够在一个线程中修改对象的位置并在另一个线程中读取它。 解决此问题的标准方法是编写以下代码: private int xpos; private object xposAccess; public int getXpos() { int result; synchronized (xposAccess) { result = xpos; } return result; } public void setXpos(int xpos) { synchronized (xposAccess) { this.xpos = xpos; } } 但是,我正在编写一个实时游戏引擎,而不是一个20个问题的应用程序。 我需要快速工作,特别是当我访问和修改它们时,就像我处理图形资产的位置一样。 我想删除同步开销。 更好的是,我想完全删除函数调用开销。 private int xpos; private int bufxpos; … public void finalize() { […]

同时使用MediaPlayer播放多首歌曲:只有一首真正在播放

我需要帮助在Android同时播放多个音轨。 我应该使用Android.Media.MediaPlayer在同一时间播放三个音轨 。 昨天我成功地做到了这样做: MediaPlayer track1 = MediaPlayer.create(this, R.raw.track1); MediaPlayer track2 = MediaPlayer.create(this, R.raw.track2); MediaPlayer track3 = MediaPlayer.create(this, R.raw.track3); 如您所见,我在这里有三个区分 MediaPlaye 实例 。 因为我被要求,我需要在后台线程中播放这些MediaPlayer 。 这是我启动MediaPlayers的部分: //let’s suppose this code snippet is in a run() method inside a Thread (which is the case) track1.start(); track2.start(); track3.start(); 如果我昨天说,这是因为第二天,它没有按预期工作。 实际上, 启动MediaPlayer似乎会停止任何以前播放的MediaPlayer 。 我在调试器模式下测试过:显然, track2.start()停止track1的MediaPlayer并遵循相同的模式, track3.start()停止tack2的MediaPlayer。 所以最后, 只有track3正在播放 […]

在等待退出信号时处理InterruptedException(Android中的错误?)

我遇到过下面的代码,我想知道它是否完全符合我的想法: synchronized(sObject) { mShouldExit = true; sObject.notifyAll() while (!mExited) { try { sObject.wait(); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } } 关于上下文:还有另一个线程检查mShouldExit (在sObject监视器内)并在这种情况下退出。 这看起来对我来说不是一个正确的模式。 如果发生中断,它将再次设置中断状态,因此当它返回到sObject.wait() ,会出现另一个InterruptedException等等。因此,它永远不能进入真正的等待状态( sObject.wait() )即它永远不会释放sObject监视器。 这可能导致无限循环,因为另一个线程无法将mExiting设置为true,因为它永远不能进入sObject的监视器。 (所以我认为interrupt()调用是一个错误,它不能在这里使用。)我错过了什么? 请注意,代码段是官方Android框架源代码的一部分。 更新:实际上,情况更糟,因为在GL渲染开始时Android中使用了相同的模式。 GLSurfaceView.GLThread.surfaceCreated()的官方源代码: public void surfaceCreated() { synchronized(sGLThreadManager) { if (LOG_THREADS) { Log.i(“GLThread”, “surfaceCreated tid=” + getId()); } mHasSurface = true; sGLThreadManager.notifyAll(); while((mWaitingForSurface) && […]