Articles of multithreading

android-如何在主线程不同的线程中运行Service?

我正在尝试在android中开发一个应用程序,它包含一个服务来读取传感器值多个小时。 当我启动服务时,我的设备会挂起,所有其他进程都会变慢。 为了解决这个问题,我尝试在单独的线程中启动服务,如下所示,但问题仍然存在。 new Thread(new Runnable() { @Override public void run() { Intent intent=new Intent(getApplicationContext(), SensorService.class); startService(intent); } }).start(); 此线程仅在不同的线程中启动服务,但服务在主线程中运行。 Plz有人帮我如何在单独的线程中运行服务?

解释多核性能跟踪(Eclipse / Android)

我正在开发一款安卓游戏,我开始注意到在开发过程中有点迟钝,所以我想尝试利用multithreading来获得乐趣和学习。 我的应用程序有3个主题: UI线程(应该大部分是空闲的) 游戏逻辑线程 图形线程 我尽可能地最小化了线程2和线程3之间的关键部分,并且认为游戏逻辑可以独立于渲染线程进行更新,然后在两个线程的末尾,我可以有一个尽可能短的窗口,我推动所有线程图形从逻辑线程更新到游戏循环。 这应该允许两个线程在大多数情况下独立工作。 理论上听起来像是表演胜利。 然而,一旦我开始实施,我的表现就大了不少。 它比以前更糟糕,一个更新和渲染循环花了50毫秒(20fps),所以它看起来像垃圾。 这只是渲染了大约20个三角形和20个纹理四边形,这是一个非常简单的工作量(我不敢想到当我实现适当的图形时会是什么)。 无论如何,我在android中使用DDMS跟踪来描述出现问题或者可以改进的地方。 http://i.stack.imgur.com/DDUYE.png 这是我游戏大约3帧的视图。 到目前为止,它似乎大致按照我的预期进行。 以蓝色突出显示的部分是锁定部分,它看起来是正确的(保持glThread在锁定时大多等待)。 然而,一旦我解锁它,我应该看到两个线程同时工作,看起来它们是,但如果我仔细观察: http://i.stack.imgur.com/vukXQ.png 我正在双核手机上进行开发,但是如果我理解了正确的跟踪它看起来并不像是并行执行任何操作,那么更糟糕的是它似乎每毫秒切换活动线程数百次! (除非我不正确地解释这个)。 所有这些上下文切换似乎对性能都很糟糕,所以我不确定为什么它会如此快速地来回切换。 因此,在我冗长的解释之后,我想知道一些事情: 我的理解是正确的,跟踪中填充的矩形是活动线程,彩色线条是睡眠线程吗? 否则他们是什么意思? 为什么我没有看到我的线程同时在所谓的双核手机上运行? 为什么它如此迅速地切换活动线程? 在DDMS中,我收到警告“警告:调试器处于活动状态;方法跟踪结果将会出现偏差”。 这有什么值得担心的吗? 我怎么能摆脱这个警告? (我通过Run launce app,而不是通过Debug,如果它有所作为)

停止/销毁线程

我有一个启动Thread和Runnable的服务。 t = new Thread(new Runnable() { public void run() { doSomething(); } }); t.start(); 该线程的原因是执行异步任务doSomething() 。 现在让我们不要担心其他类AsyncTask。 我已经尝试过它并不适用于我的情况。 编辑:我不能使用AsyncTask,因为它仅适用于UI线程。 这段代码必须在服务内部运行,所以nope,没有AsyncTask 🙁 doSomething()包含一些外部库,所以我遇到的问题是它可能挂在其中一个命令上,而不返回任何值(因此甚至不能进行错误检查) 为解决这个问题,我希望在某些时候破坏服务。 stopService(new Intent(“net.MyService.intent)); 这很好用,很容易在手机上validation。 但是,即使生成它的服务被销毁,上面创建的Thread也将继续运行。 因此,我正在寻找在Service的onDestroy()中插入的正确命令,它将为我清理Thread。 t.destroy(); t.stop(); 都折旧并导致应用程序崩溃。 我从某个地方拿了这个代码 @Override public void onDestroy() { Thread th = t; t = null; th.interrupt(); super.onDestroy(); } 但它仍然无效,线程继续运行。 有帮助吗?

如何在Java / Android中另一个线程启动之前等待线程完成?

假设我有这个非常简单的代码: for(int i = 0; i < 10; i++) { thread = new Thread(this); thread.start(); } 但是,在此代码中,线程显然一次启动10次,并且在前一个完成之前不会等待。 在让线程再次启动之前,如何检查线程是否已完成?

在工作线程中启动异步任务

我有两个问题: 我们可以在工作线程中启动/执行异步任务吗? 如果是,则在UI线程上调用onPreExecute() , onProgressUpdate(Progress…)和onPostExecute(Result)方法? 我想知道,因为我在工作线程上运行TCP连接,当收到数据包时,我想启动一个新线程来解析这个数据包,之后刷新UI线程上的一些数据结构。 提前致谢!

Android Lollipop 5.0.1 SQLiteLog POSIX错误11 SQLite错误:3850

我在升级应用程序以支持Android Lollipop时遇到问题。 该应用程序实现了一个SyncAdapter,它通过内容提供程序在数据库上写入。 同时,用户正在浏览应用程序的前端,其中加载程序从数据库中读取相同的数据。 加载程序还可以监听数据更改。 现在,如果我在前Lollipop设备上运行该程序,一切正常,没有任何错误输出。 在Lollipop而不是我收到以下logcat消息: 11:20:59.344 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 11:20:59.364 22341-22376/com.example.com E/SQLiteLog﹕ (10) POSIX Error : 11 SQLite Error : 3850 […]

在Android中的主线程上执行代码而无需访问Activity?

我有一个启动和维护后台线程的Android服务。 后台线程有时需要在主线程上进行回调。 我很难过如何做到这一点。 我无法调用this.runOnUiThread,因为“this”是Service的一个实例,而不是Activity,而Service没有runOnUiThread方法。 我也无法创建或执行AsyncTask,因为AsyncTask的文档说必须从UI线程调用构造函数和execute方法。 我是否需要维护对使用该服务的活动的引用并调用其runOnUiThread方法,还是有另一种方法在UI线程上运行某些东西? 谢谢。

是否连续暂停/停止和启动/恢复Java TimerTask?

我有一个关于Java TimerTask的简单问题。 如何根据特定条件暂停/恢复两个TimerTask任务? 例如,我有两个相互之间运行的定时器。 当在第一计时器的任务内满足某个条件时,第一计时器停止并启动第二计时器,并且当在第二计时器的任务内满足某个条件时发生相同的事情。 下面的课程显示了我的意思: public class TimerTest { Timer timer1; Timer timer2; volatile boolean a = false; public TimerTest() { timer1 = new Timer(); timer2 = new Timer(); } public void runStart() { timer1.scheduleAtFixedRate(new Task1(), 0, 1000); } class Task1 extends TimerTask { public void run() { System.out.println(“Checking a”); a = SomeClass.getSomeStaticValue(); if […]

Android:“类加载器可能会因托管多个应用程序的进程而失败”

Eclipse的logcat for Android中的这条消息是什么意思? W/ActivityThread: ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader()); 不幸的是,没有关于此警告的上下文,所以我不知道是什么导致了这个问题以及我如何解决它。

Android Instrumentation测试 – UI线程问题

我正在尝试为我的Android应用程序编写一个Instrumentation Test。 我遇到了一些奇怪的线程问题,我似乎无法find解决方案。 我的原始测试: @RunWith(AndroidJUnit4.class) public class WorkOrderDetailsTest { @Rule public ActivityTestRule activityRule = new ActivityTestRule(WorkOrderDetails.class); @Test public void loadWorkOrder_displaysCorrectly() throws Exception { final WorkOrderDetails activity = activityRule.getActivity(); WorkOrder workOrder = new WorkOrder(); activity.updateDetails(workOrder); //Verify customer info is displayed onView(withId(R.id.customer_name)) .check(matches(withText(“John Smith”))); } } 这导致了一个 android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。 … com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails(WorkOrderDetails.java:155) updateDetails()方法唯一做的就是调用setText() 。 经过一番研究,似乎在我的测试中添加UiThreadTestRule和android.support.test.annotation.UiThreadTest注释就可以解决问题。 @UiThreadTest: @RunWith(AndroidJUnit4.class) […]