Articles of multithreading

如何设置线程的名称?

有没有办法在代码中为线程设置友好名称? 例如,我希望图像上名为Thread-11的线程被命名为“MyImportThread”。 example-threads http://img.androidcookie.com/java/threadname.png

什么是更高效的广播接收器或处理器?

我知道广播接收器的onReceive()和Handler的handleMessage()在同一个UI线程上运行。 假设我想在同一个应用程序(进程)中的两个服务之间进行通信。 我可以扩展广播接收器类并注册事件 要么 一个Handler,然后将其实例传递给另一个用于sendMessage()调用的服务。 在这两种情况下,我都需要添加一些新的开关案例。 但哪种方法更有效? 让我们假设代码是线程安全的(没有UI更新)。

如何立即刷新图像视图

在我的Android应用程序中,我从云下载图像。 下载是在一个线程中执行的,在同一个线程中,我还使用新下载的图像设置了一个图像视图。 设置图像后,我调用postinvalidate() 。 但是图像不会立即显示出来。 有没有办法让重绘立即发生? 我需要一种触发绘图周期的方法。

animation师只能在Looper线程Android上运行

我正在尝试在任务完成时animation一些东西。 这里的问题是我收到此错误消息: android.util.AndroidRuntimeException: Animators may only be run on Looper threads at android.animation.ValueAnimator.cancel(ValueAnimator.java:1004) at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:965) at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:921) at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:735) at com.design.zaton.prototypei.MainActivity$1$1.run(MainActivity.java:93) at java.lang.Thread.run(Thread.java:761) 该应用程序使用相同的确切代码工作正常,但现在它根本没有。 我真的很困惑。 这是错误发生的地方: new Thread(new Runnable() { @Override public void run() { final String s = getGiphyViews(String.valueOf(mEdit.getText())); runOnUiThread(new Runnable() { @Override public void run() { result.setText(s); } }); loading.animate() .alpha(0) .setDuration(100); done.animate() […]

如何将两种不同的数据types传递给AsyncTask,Android

我有一个方法,它执行SQLite数据库更新并将其放在AsyncTask中,以使其更快,更可靠。 但是,更新数据库需要两个数据。 一个是Integer,另一个是此处显示的PrimaryKeySmallTank类的对象。 在AsyncTask的doInBackground方法的参数中使用params数组,我可以传入一个Integer,但是如果我有两种不同types的数据呢? 如果整数存储在int … params [0]中,我不能在params [1]中存储不同的types对象,那么可以做些什么呢? 对象我想传递给AsyncTask public class PrimaryKeySmallTank { int contractNumber; int customerCode; int septicCode; String workDate; int workNumber; } 我正在使用的AsyncTask public class UpdateInfoAsyncTask extends AsyncTask{ @Override protected void onPreExecute() { // TODO Auto-generated method stub } @Override protected Void doInBackground(Integer… params) { Integer mIntegerIn = params[0]; // this is […]

ANR与阻塞的HeapTaskDaemon线程

我的Android应用中出现了ANR错误。 跟踪显示只有一个处于阻塞状态的线程(所有其他线程处于状态等待,hibernate,本机,…),因此它似乎没有处于死锁状态。 有两个线程我手动启动(直接),所以我大致知道我的应用程序的哪个部分发生了ANR。 不幸的是,我无法理解被阻塞线程的痕迹。 也许有人有想法? 被阻止的线程: “HeapTaskDaemon” daemon prio=5 tid=6 Blocked | group=”system” sCount=1 dsCount=0 obj=0x12cfc8e0 self=0xab4b2bf0 | sysTid=10048 nice=0 cgrp=default sched=0/0 handle=0xf4815930 | state=S schedstat=( 113876044 26950467 98 ) utm=9 stm=2 core=5 HZ=100 | stack=0xf4713000-0xf4715000 stackSize=1038KB | held mutexes= native: pc 0000000000016908 /system/lib/libc.so (syscall+28) native: pc 00000000000f604b /system/lib/libart.so (_ZN3art17ConditionVariable4WaitEPNS_6ThreadE+82) native: pc 00000000001cddb1 /system/lib/libart.so (_ZN3art2gc13TaskProcessor7GetTaskEPNS_6ThreadE+92) […]

图像需要太长时间才能加载?

编辑: 在进行方法跟踪后,每当我用紫色方块切换时,图形会上升很多。 当我用蓝色或绿色圆圈切换时,它会保持低位: 以下是与紫色方块交换的方法: 我有一个应用程序交换两个按钮。 有一个红色按钮,当它被点击时,它从其他三个按钮中选择一个随机按钮,并交换。 我尝试通过交换图像来做到这一点。 在onClickListener中,我只使用带有红色按钮的按钮来监听点击。 获取随机图像 把它留空 寻找红色按钮 给出随机图像的红色按钮背景(交换) 给出随机图像(现在是空白的)红色背景 如果这令人困惑……请留下它。 但: 每当我将图像从较大的图像切换到较小的图像时,该过程需要更长的时间。 在两个较小的图像之间交换时要快得多。 我该如何解决。 是否有一个最适合Android的图像大小? 这是布局代码: https://gist.github.com/anonymous/813883bce89606d2a82e 正如你在图像中看到的那样,用蓝色圆圈比用紫色方块交换背景图像要花费更多(很多!)。 为什么…? 根据图像尺寸,为什么(我只是更改图像并检查带红色图像的按钮)的速度较慢? 我应该使用什么图像尺寸? 非常感谢你的时间

Android – 从计时器线程更新位图

我有一个由一个带有ImageView的布局组成的Android项目。 public class MainActivity extends AppCompatActivity { /* original and stretched sized bitmaps */ private Bitmap bitmapOriginal; private Bitmap bitmapStretched; /* the only view */ private ImageView iv; …. } 此ImageView由此runnable函数更新 runnable = new Runnable() { @Override public void run() { iv.setImageBitmap(bitmapStretched); } }; runnable由一个在后台线程上运行的临时JNI函数运行,每秒调用60次。 public void jniTemporizedCallback(int buf[]) { /* set data to original […]

Android中的新线程(任务).start()VS ThreadPoolExecutor.submit(任务)

在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,调用db等)。 这不是长时间运行的任务(最多几秒钟)。 到目前为止,我正在创建一个新线程,通过该任务传递一个新的runnable。 但是最近我读了一篇关于Java中的线程和并发的文章,并且理解为每个任务创建一个新的Thread并不是一个好的决定。 所以现在我在我的Application类中创建了一个ThreadPoolExecutor ,它包含5个线程。 这是代码: public class App extends Application { private ThreadPoolExecutor mPool; @Override public void onCreate() { super.onCreate(); mPool = (ThreadPoolExecutor)Executors.newFixedThreadPool(5); } } 我还有一种方法可以将Runnable任务提交给执行者: public void submitRunnableTask(Runnable task){ if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){ mPool.submit(task); } else { new Thread(task).start(); } } 因此,当我想在我的代码中运行异步任务时,我得到App的实例并调用submitRunnableTask方法将runnable传递给它。 正如你所看到的,我也检查一下,如果线程池有自由线程来执行我的任务,如果没有,我创建一个新线程(我不认为这会发生,但无论如何……我不知道我希望我的任务在队列中等待并减慢应用程序)。 在应用程序的onTerminate回调方法中,我关闭了池。 所以我的问题如下:这种模式是否比在代码中创建新的线程更好? 我的新方法有哪些优点和缺点? 它会引起我不知道的问题吗? 你能告诉我一些比这更好的东西来管理我的异步任务吗? PS我在Android和Java方面有一些经验,但我远不是一个并发大师。所以可能有些方面我在这类问题中不太了解。 任何建议将被认真考虑。

animation师只能在Sherlock Action Bar上的Looper线程上运行

我想在1秒延迟后隐藏动作栏, Timer().schedule(new TimerTask() { @Override public void run() { getSupportActionBar().hide(); } }, 1000); 运行代码后崩溃.. android.util.AndroidRuntimeException:animation师只能在Looper线程上运行 这个问题有什么解决方案吗? 谢谢。