GVKun编程网logo

我们何时需要在android应用程序中使用runOnUiThread?

4

关于我们何时需要在android应用程序中使用runOnUiThread?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidJavarunOnUiThread()、androi

关于我们何时需要在android应用程序中使用runOnUiThread?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Java runOnUiThread()、android – 为什么runOnUiThread()在服务中不起作用?、android – 在线程上的robolectric runOnUiThread不起作用、android – 如何单独测试`runOnUiThread`中包含的代码?等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

我们何时需要在android应用程序中使用runOnUiThread?

我们何时需要在android应用程序中使用runOnUiThread?

我有一个使用此函数运行线程的代码示例runOnUiThread。我们为什么以及何时需要使用它?

编辑

怎么样来使用AsyncTask类,什么是proscons

答案1

小编典典

runOnUiThread()当您要从非UI线程更新UI时必须使用。例如-如果您想从后台线程更新UI。您也可以将其Handler用于同一件事。

从文档-

在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。

句法 -

       Activity_Name.this.runOnUiThread(new Runnable() {            @Override            public void run() {                // your stuff to update the UI            }        });

更新-

AsyncTask -

如果您要执行某些Networkoperation阻止UI的操作,那么AsyncTask是最佳选择。还有其他几种方法可以执行与您可以使用的相同的后台操作ServiceIntentService也可以执行后台操作。使用AsyncTask可以帮助您完成UI工作,并且在进行后台操作之前不会阻塞UI。

从文档-

通过AsyncTask,可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

Android Java runOnUiThread()

Android Java runOnUiThread()

我一直在弄乱runOnUiThread方法。如果我只是在活动中创建一个方法:

public void Test(){    runOnUiThread(new Runnable()     {        public void run()         {            Log.v("mainActivity", "test");        }    });     }

我注意到该可运行对象仅运行一次。但是,这不是问题。我想知道的是,如果我完全遗漏了某些东西,并且它在后台执行了某些操作,当我多次执行该方法时,它将导致帧速率下降。

答案1

小编典典

这是Activity.runOnUiThread(Runnable)的全文:

public final void runOnUiThread(Runnable action) {    if (Thread.currentThread() != mUiThread) {        mHandler.post(action);    } else {        action.run();    }}

该方法的主体是在你的后台线程仍然执行,类mHandler
android.os.Handler实现了的Runnable内部队列中的发布到它,所以,除非你正在做的工作,堵在了Runnable(这是一个
很大的 不不上(UI线程)或在短时间内调用此方法一千次以上,您应该不会看到任何区别。

现在,如果您正在调用Handler.postAtFrontOfQueue(Runnable),那么就会出现问题,因为您的Runnable本质上是“
插队
”。在这种情况下,这可能会导致结结,因为正在执行您的Runnable而不是需要进行的任何UI更新(如滚动)。

请注意,您只 需要 在UI线程上运行UI更新,例如在View上调用任何方法(因此称为“ UI
Thread”以及该方法的存在原因)或文档明确指出需要在其上运行的任何操作。 UI线程。否则,如果您已经在使用后台线程,则没有真正的理由离开它。

android – 为什么runOnUiThread()在服务中不起作用?

android – 为什么runOnUiThread()在服务中不起作用?

我正在创建一个应用程序,即使应用程序没有运行,也需要每分钟更新一次值.

当然,我已经设置了一个简单的服务来做到这一点.我设置了调试消息,告诉我服务何时启动,何时更新(每分钟)以及何时关闭.我还有一条消息告诉我何时在runOnUiThread()方法中更新值.除runOnUiThread()中的消息外,我的所有消息都会激活.有什么我做错了(当然有)?我需要改变什么?

码:

@Override
public void handleMessage(Message message) {

    try {

        if (!serviceStarted) {

            serviceStarted = true;
            serviceTest = true;

            while (serviceStarted) {

                new MainActivity().runOnUiThread(new Runnable() {

                    public void run() {

                            OverviewFragment.refresh(getApplicationContext());
                            System.out.println("yay");

                         }
                });

                Thread.sleep(((1 /* minutes */) * 60 * 1000));
                System.out.println("Updated values through service.");

            }
        }


    } catch (InterruptedException e) {

        Thread.currentThread().interrupt();
        e.printstacktrace();

    }

    stopSelf(message.arg1);
}

解决方法:

So there’s no need to do that, unless you’re creating a Thread inside
of it

Gabe Sechan的回答是正确的.

但是,如果您使用单独的线程,而不是遵循代码:

new MainActivity().runOnUiThread(new Runnable() {
       public void run() {
            OverviewFragment.refresh(getApplicationContext());
                 System.out.println("yay");

       }
});

试试,这段代码:

new Handler(Looper.getMainLooper()).post(new Runnable() {
       public void run() {
            OverviewFragment.refresh(getApplicationContext());
                 System.out.println("yay");
       }
});

按照Android docs

Caution: A service runs in the main thread of its hosting process—the
service does not create its own thread and does not run in a separate
process (unless you specify otherwise).

android – 在线程上的robolectric runOnUiThread不起作用

android – 在线程上的robolectric runOnUiThread不起作用

runOnUiThread()在线程中执行时似乎不起作用.有人知道一个变通方法吗?

注意:我在这里提交了一张票 – https://github.com/robolectric/robolectric/issues/2479

import android.app.Activity;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import static org.junit.Assert.assertTrue;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class RunOnUiThreadTest {

    /**
     * Works
     * @throws Exception
     */
    @Test
    public void inside_the_main_thread() throws Exception {
        final Activity activity = Robolectric.setupActivity(Activity.class);
        final CountDownLatch latch = new CountDownLatch(1);
        final AtomicBoolean didRun = new AtomicBoolean(false);

        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                didRun.set(true);
                latch.countDown();
            }
        });

        latch.await(20, TimeUnit.SECONDS);
        assertTrue(didRun.get());
    }

    /**
     * Fails
     * @throws Exception
     */
    @Test
    public void inside_a_new_thread() throws Exception {
        final Activity activity = Robolectric.setupActivity(Activity.class);
        final CountDownLatch latch = new CountDownLatch(1);
        final AtomicBoolean didRun = new AtomicBoolean(false);

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        didRun.set(true);
                        latch.countDown();
                    }
                });
            }
        });
        thread.start();

        latch.await(20, TimeUnit.SECONDS);
        assertTrue(didRun.get());
    }

}

解决方法:

由于第二个测试阻止了运行目标Runnable所需的UI线程,因此测试结果可能正如预期的那样.

第一个测试将通过,因为整个方法是同步执行的.由于您已经在UI线程上,因此在调用activity.runOnUiThread(…)时,将立即执行Runnable.由于锁存器是0,latch.await(20,TimeUnit.SECONDS)立即返回,并且断言为真.

在第二个示例中,您启动一​​个新线程并从其中调用activity.runOnUiThread(…).由于您不在UI线程上,因此Runnable将发布到UI线程上的Handler,以便将来异步执行.此时你继续调用latch.await(20,TimeUnit.SECONDS);来自UI线程,这意味着在此期间Runnable无法运行,因为您阻止了UI线程.

20秒后,线程恢复,但Runnable从未有机会运行,因此断言失败,因为didRun()从未设置为true.

下面是一个更新的测试,允许使用runOnUiThread()发布的Runnable运行.

@Test
public void inside_a_new_thread() throws Exception {
    final Activity activity = Robolectric.setupActivity(Activity.class);
    final CountDownLatch latch = new CountDownLatch(1);
    final AtomicBoolean didRun = new AtomicBoolean(false);

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    didRun.set(true);
                    latch.countDown();
                }
            });
        }
    });
    thread.start();

    // sleep current thread to give the new thread a chance to run and post the runnable
    Thread.sleep(1000);

    // This method will cause the runnable to be executed
    Robolectric.flushForegroundThreadScheduler();

    // Should immediately return since the runnable has been executed
    latch.await(20, TimeUnit.SECONDS);
    assertTrue(didRun.get());
}

android – 如何单独测试`runOnUiThread`中包含的代码?

android – 如何单独测试`runOnUiThread`中包含的代码?

我有一个调用runOnUiThread的函数,如下所示

fun myFunction(myObject: MyClass, view: MyView) {
    // Do something
    view.getActivity().runOnUiThread {
        myObject.myObjectFunction()
    }
}

我想使用UnitTest myFunction来确保myObject调用myObjectFunction.但鉴于它是在runOnUiThread中包装,我无法达到它.

我如何进行单元测试以确保调用runOnUiThread中的代码?

解决方法:

管理以找到使用ArgumentCaptor执行测试的方法.在runOnUiThread()函数中捕获Runnable,然后通过runOnUiArgCaptor.value.run()触发运行

import com.nhaarman.mockito_kotlin.argumentCaptor
import com.nhaarman.mockito_kotlin.verify
import com.nhaarman.mockito_kotlin.whenever
import org.junit.Before
import org.junit.Test
import org.mockito.Mock

@Mock lateinit var activity: Activity
@Mock lateinit var view: MyView
@Mock lateinit var myObject: MyObject

@Before
fun setUp() {
    MockitoAnnotations.initMocks(this)
}

@Test
fun my_test_function() {
    whenever(view.getActivity()).thenReturn(activity)

    val runOnUiArgCaptor = argumentCaptor<Runnable>()
    val myTestObject = TestObject()

    myTestObject.myFunction(myObject, view)
    verify(activity).runOnUiThread(runOnUiArgCaptor.capture())
    runOnUiArgCaptor.value.run()

    verify(myObject).myObjectFunction()

}

今天的关于我们何时需要在android应用程序中使用runOnUiThread?的分享已经结束,谢谢您的关注,如果想了解更多关于Android Java runOnUiThread()、android – 为什么runOnUiThread()在服务中不起作用?、android – 在线程上的robolectric runOnUiThread不起作用、android – 如何单独测试`runOnUiThread`中包含的代码?的相关知识,请在本站进行查询。

本文标签: