问题标签 [android-thread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
43 浏览

android - 在 Android 应用程序中执行长时间运行的网络操作的权威、“正确”方式是什么?

我正在开发一个应用程序,该应用程序将与 UDP 服务器进行通信以获取其数据。显然,这将是一个长期运行的过程(即活动的生命周期),所以我想在后台运行这个过程。当应用程序从 UDP 服务器获取数据时,我显然会想要操作数据,以便可以在应用程序的 UI 中显示它。

据我所知,在后台运行长时间运行的进程有 3 种方法:

  1. 标准 Java 线程
  2. 异步任务
  3. 服务(有界)

对于标准的 Java 线程,从我在 Internet 上的搜索中,我听到了很多关于如何在 Android 中创建自己的线程不是一个好主意的抱怨。我之前尝试过这条路线并且它确实有效,但它也需要相当多的操作才能在应用程序的 UI 中使用线程接收到的数据。

对于 AsyncTask,Android 文档本身说:

理想情况下,AsyncTasks 应该用于短操作(最多几秒钟。)

这对我不利,因为我需要这个线程在活动的整个生命周期中运行。

最后是绑定服务。这似乎非常适合我的需求。同样,来自 Android 文档:

Service 是一个应用程序组件,可以在后台执行长时间运行的操作,它不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。此外,组件可以绑定到服务以与其交互,甚至执行进程间通信 (IPC)。

读完这篇文章后,我继续走 Android 服务路径。在我尝试运行我的应用程序之前,一切都很顺利。


首先,这是我的服务:

监听器.java

而且,我的MainActivity.java绑定到这个服务:


我很快发现,即使我是从服务中执行此操作的,但它显然仍在从主线程运行,因为我收到此错误:

从我的Listener.java中读取的行中server.receive(recvPacket);

在四处挖掘之后,我发现我可能需要一个线程或 AsyncTask 来处理这个问题。

所以,我的问题是:在 Android 应用程序中执行长时间运行的网络操作的权威、“正确”方式是什么?

为什么 Android 让真正的 Android 应用程序的“面包和黄油”变得如此困难?我知道我不能成为第一个想要这样做的人。

谢谢你的帮助。

0 投票
1 回答
1008 浏览

android - 如何从断点找到调用线程堆栈跟踪?

我的 Android 代码中有一个线程,在调试时,我需要在线程内设置一个断点。但是,一旦我在线程内部的断点处,我就看不到调用线程的堆栈跟踪。此时,我通常需要在调用线程处设置一个新的断点并从那里获取。

在此处输入图像描述

如上图所示,调试器中的堆栈跟踪将 run() 显示为顶级方法。如何在堆栈跟踪中向上移动,或切换线程以查看 start() 以及之前的任何内容?

0 投票
0 回答
26 浏览

java - Android:Thread.sleep() 使应用程序崩溃

我想等待一段时间,getActivity().getSupportFragmentManager().popBackStack();但如果我调用 Thread.sleep 或任何其他解决方案来等待时间,如果我等待 1000 毫秒,应用程序就会崩溃。相反,如果我等待 100 毫秒,应用程序不会崩溃,我不知道为什么

这是我的代码:

这是我的日志:

0 投票
3 回答
73 浏览

android - 如何每 2 秒在 TextView 中检查和设置网络状态?

我想在TextView中设置网络状态,我想重复调用方法并在后台设置,所以我使用了无限循环的AsyncTask类

但它不起作用,它停止了我的应用程序。

0 投票
1 回答
685 浏览

android - Thread.sleep() 在 Android 中导致 ANR

此代码在后台线程上运行:

在开发者控制台中,我看到 ANR 报告:

ANR 输入调度超时(等待发送非键事件,因为触摸窗口尚未完成对 500.0 毫秒前传递给它的某些输入事件的处理。)

如何解决此 ANR?

0 投票
2 回答
9164 浏览

android - 无法访问主线程上的数据库 - Android Room - 使用 ThreadPoolExecutor

我遇到了那个著名的错误"Cannot access database on the main thread since it may potentially lock the UI for a long periods of time"但是据我了解,我没有在主线程中访问数据库,因为我正在由 ThreadPoolExecutor 执行的 Runnable 中执行调用。我究竟做错了什么?

在下面的方法中,我使用一个 runnable 从网络获取数据并将其存储在本地数据库中。

数据源.save:

执行者定义为:

我得到的错误:

0 投票
0 回答
60 浏览

android - 新线程上的 getName() 返回 'main'

我初始化并运行一个新onCreate()线程MainActivity

为什么是这条线的输出TAG: main

这个线程不应该是一个新线程吗?

如果我在线程中插入一个无限while循环,我的应用程序就会锁定,这表明这个新线程确实是主线程。

我就是不明白。我不是在创建一个新线程吗?为什么?

0 投票
1 回答
81 浏览

android - 在 MainActivity 上运行音调的 Android 开发

我正在编写代码以在我的应用程序启动时播放小号音调。你能解释一下我在这里写下的代码的含义吗?

0 投票
5 回答
3024 浏览

systrace - 命令行错误的 Systrace

我正在尝试使用 systrace。为此,我正在阅读官方网站

但在终端上运行此命令后:

我收到这些错误:

我的python版本:

我已将 python PATH添加到 ** system ENVIRONMENT** 。我通过命令使用 Systrace 的主要目标是使用Tracing Application Code。我放:

到我的代码,我想通过 -a 或 --app= options将此输出视为对 systrace 的跟踪。

GUI systrace 在google chrome上运行良好,并且在此浏览器中运行良好。

0 投票
1 回答
38 浏览

android - 这种活动的线程类型是什么?

我有一个由后台服务启动的活动,以显示该服务从服务器接收到的滚动消息。可以只有一个滚动消息或一组多个滚动消息,一次滚动一个。

我的问题是管理循环滚动多条消息和多组多条消息的理想方法是什么?我已经在工作线程、AsyncTask 等中尝试了我的循环器循环。

细节:

我的滚动活动接收要显示的消息,作为可用于从服务范围访问的字符串数组。例如,服务启动 Activity 以便一个接一个地滚动多条消息:

  1. 我的服务填充MyService.messages[]了要显示的消息,然后启动MyScrollActivity
  2. MyScrollActivity大小为MyService.messages[]. 如果 >1,则启动MyCyclerThread (或 AsyncTask 等 - 还没有找到最好的方法!)
  3. MyCyclerThread循环MyService.messages[]并设置MyScrollActivityTextViewmessages[i]并在屏幕上设置一次动画,一次一个消息迭代(一条消息滚动,然后下一条,等等 - 在循环结束时,它重新开始i=0并再次重复消息。
  4. 重复步骤 3 直到活动被服务取消或显示另一个活动。循环器线程(或其他任何循环)此时需要终止。

我希望那个特定的工作线程(正在进行循环)死掉,并且在它的活动停止时永远不会回来。但是由于某种原因,每当重新启动活动时(例如进入显示一批新消息),旧的循环器/工作线程就会复活,以及新消息的新线程。

我尝试添加Thread.currentThread().interrupt()到活动onPauseonDestroy方法中,我在日志中看到线程确实被中断了。但就像我说的那样,它会复活(即使使用以前的相同 ID)并再次开始循环。这意味着无论我开始活动多少“X”次,我也会获得“X-1”个线程运行。

我玩弄了 Activity 单实例 XML、各种“isThreadABCrunning”标志等。我什至尝试在我的循环器循环中使用 AsyncTask。我的想法不多了。

帮助,我是Android的初学者/中级......显然,我知道足以制造麻烦。关于线程或活动,我有什么遗漏吗?是否可能像以不同方式处理我的活动一样简单?

我很感激 30,000 英尺的概述,然后我可以根据需要提供代码示例(我已经经历了太多的迭代,暂时无法确定一个在这里发布),如果我快要违反了,很抱歉帖子的最佳实践。

更新:动画代码