标签: android-looper

后台线程中的PhoneStateListener

我在尝试在后台线程中对 * 回调方法运行 PhoneStateListener 时遇到问题。这是我到目前为止所做的:

首先,我编写了我的 PhoneStateListener 实现。一些关于:

public MyPhoneStateListener extends PhoneStateListener {
    private TelephonyManager mTelephonyManager;

    public MyPhoneStateListener(Context context) {
        mTelephonyManager = (TelephonyManager) context.getSystemServices(Context.TELEPHONY_SERVICE);
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) { ... }

    public void startListening() {
        mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个 Handler 类:

public PhoneStateHandler extends Handler {
    private Context mContext;
    private MyPhoneStateListener mListener;

    public static final int MESSAGE_START = 0;

    public PhoneStateHandler(Context context, Looper looper) {
        super(looper);
        mContext = context;
    }

    @Override
    public void onHandleMessage(Message message) …
Run Code Online (Sandbox Code Playgroud)

multithreading android phone-state-listener android-looper

6
推荐指数
0
解决办法
1207
查看次数

HandlerThread中的NullPointerException

这个错误困扰了我好几个小时.我收到了NullPointerException.问题是这个错误不一致.它发生在我启动应用程序时,但只是偶尔发生.所以我不确定是什么导致它.

我为错误日志的冗长问题道歉,但我找不到另一种询问方式.

错误日志如下:

FATAL EXCEPTION: main
Process: com.myproject.android, PID: 22175
java.lang.NullPointerException
    at com.myproject.android.ImageDownloaderThread.queueImage(ImageDownloaderThread.java:74)
    at com.myproject.android.NewsItemPagerActivity$NewsItemFragmentStatePagerAdapter.getItem(NewsItemPagerActivity.java:325)
    at android.support.v13.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:109)
    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
    at android.view.View.measure(View.java:16497)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
    at android.view.Choreographer.doFrame(Choreographer.java:544)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515) …
Run Code Online (Sandbox Code Playgroud)

android message-queue background-thread android-handlerthread android-looper

5
推荐指数
1
解决办法
2582
查看次数

获取java.lang.IllegalStateException:当前线程必须有一个looper

我收到此错误,我的应用程序崩溃:

java.lang.IllegalStateException:当前线程必须有一个looper!

我没有太多关于如何在谷歌上使用looper,我使用线程(主要用于睡眠功能),处理程序(用于在Async任务运行时下载图像)和异步任务(用于从URL获取JSON数据) .我不知道如何解决这个问题,所以任何建议都会有所帮助.

这是单击按钮时执行的线程的代码:

View view = flingContainer.getSelectedView();
          view.findViewById(R.id.item_swipe_right_indicator).setAlpha((float) 1.0);

        Thread timer = new Thread() {
            public void run() {
                try {
                    sleep(320);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    flingContainer.getTopCardListener().selectLeft();
                }
            }
        };
        timer.start();
Run Code Online (Sandbox Code Playgroud)

我正在使用这个 libray和log-cat是: 图片

其中:at com.enormous.quotesgram.MainActivity$3.run(MainActivity.java:479)在log-cat中的最后一行对应flingContainer.getTopCardListener().selectLeft();于上面的代码行:

performance android android-asynctask android-looper

5
推荐指数
1
解决办法
5564
查看次数

什么是 E/AbstractTracker:无法在未调用 Looper.prepare() 的线程内创建处理程序?

我过去曾遇到过这个问题,但我并没有想太多,因为我只是在尝试使用 IDE。但是,我意识到当我创建一个全新的应用程序时也会出现该错误,即使我没有添加自己的代码,我仍然会收到此错误,我们将不胜感激任何帮助来解决此问题。

到目前为止,我已经尝试在 UI 线程和异步线程上运行方法,但仍然没有运气。

错误:

E/AbstractTracker:无法在未调用 Looper.prepare() 的线程内创建处理程序

D/AppTracker:应用事件:停止

E/AbstractTracker:无法在未调用 Looper.prepare() 的线程内创建处理程序

D/AppTracker:应用事件:开始

multithreading android android-looper

5
推荐指数
1
解决办法
384
查看次数

处理WorkManager对网络连接失败的响应

我正在使用WorkManager将数据从本地Room数据库同步到服务器。问题是Room给Loop.MainLooper()中的数据库生成错误,当我按照以下方式使用它时,它工作正常。但是我无法根据任务完成情况在SUCCESS或RETRY上返回“ WorkerResult”。Netwrok丢失时如何停止工作?

public class TestSyncManager extends Worker {

    private final WorkerResult[] workerResult = {WorkerResult.SUCCESS};
    // @Inject            // Dagger2 has not added the support for dependency injection in worker yet.
    private ApiHeader mApiHeader;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private Runnable mRunnable;
    private DataManager dataManager;

    @NonNull
    @Override
    public WorkerResult doWork() {
        try {
            //Looper.prepare();
                CommonUtils.Log("usm_work_manager_1", "Work is Started.");

                try {
                    checkNextCall();
                } catch (Exception e) {
                    e.printStackTrace();
                    setWorkerResult(WorkerResult.FAILURE);
                }
            };
            //mHandler = new Handler(Looper.myLooper());
            mHandlerThread = new HandlerThread("LikesHandlerThread");
            mHandlerThread.start();

            Looper looper …
Run Code Online (Sandbox Code Playgroud)

android android-looper android-workmanager

5
推荐指数
1
解决办法
1643
查看次数

在 android.os.Looper 中使用 LiveData 方法 getMainLooper 进行单元测试未模拟

在尝试进行单元测试时,我无法让 liveData.postValue 工作。我一直在谷歌检查解决方案,这是我现在的代码。

public class ProjectListViewModelTest {

    GetProjectList getProjectList = Mockito.mock(GetProjectList.class);
    ProjectModel.Project project = new ProjectModel.Project("testing",
            "this is a test",
            "https://logo.jpg",
            new ProjectModel.Company("cat"),
            "20150404",
            "active");
    List<ProjectModel.Project> projects = Arrays.asList(project);
    ProjectModel.ProjectList projectsList = new ProjectModel.ProjectList(projects);

    ProjectsListViewModel projectsListViewModel;

    private PublishSubject<ProjectModel.ProjectList> projectsListPublishSubject = PublishSubject.create();

    @Rule public InstantTaskExecutorRule instantExecutorRule = new InstantTaskExecutorRule();

    @BeforeClass
    public static void setUpRxSchedulers() {
        Scheduler immediate = new Scheduler() {
            @Override
            public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
                return super.scheduleDirect(run, 0, unit);
            }

            @Override
            public Scheduler.Worker …
Run Code Online (Sandbox Code Playgroud)

junit android unit-testing android-looper android-livedata

5
推荐指数
1
解决办法
708
查看次数

即使在添加 RxImmediateSchedulerRule 之后,android.os.Looper 中的方法 getMainLooper 未被模拟仍然发生

趋势视图模型测试

@RunWith(JUnit4::class)
class TrendingViewModelTest {
    private lateinit var trendingRepository: TrendingRepository
    private lateinit var trendingViewModel: TrendingViewModel

    @get:Rule
    val schedulers = RxImmediateSchedulerRule()

    @Before
    fun setUp() {
        trendingRepository = mock(TrendingRepository::class.java)
        trendingViewModel = TrendingViewModel(trendingRepository)
    }

    @Test
    fun testWithNetwork() {
        trendingViewModel.isConnected = true
        trendingViewModel.fetchTrendingRepos()
        verify(trendingRepository, times(1)).getTrendingRepos()
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

趋势视图模型

fun fetchTrendingRepos() {
if (isConnected) {
    loadingProgress.value = true
    compositeDisposable.add(
        trendingRepository.getTrendingRepos().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ response ->
                run {
                    loadingProgress.value = false
            },
                { error ->
                    loadingProgress.value = false
                }
            )
    )
} 
Run Code Online (Sandbox Code Playgroud)

RxImmediateSchedulerRule:

class RxImmediateSchedulerRule : …
Run Code Online (Sandbox Code Playgroud)

android unit-testing android-looper rx-java2

5
推荐指数
3
解决办法
6288
查看次数

为什么主线程的 Looper.loop() 不会阻塞 UI 线程?

今天我阅读了一些关于 Handler 和 Looper 如何协同工作的博客和源代码。

根据我所学到的,通过使用ThreadLocal魔法,我们可以在每个线程上只有一个 Looper 。通常Handler是在主线程中启动的,否则你必须手动启动或说,prepare将Looper放在一个单独的线程上,然后循环起来。

class LooperThread extends Thread {
    public Handler mHandler;

    public void run() {
        Looper.prepare();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // process incoming messages here
            }
        };

        Looper.loop();
    }
}
Run Code Online (Sandbox Code Playgroud)

真正让我困惑的是loop()主线程。当我在 Looper 的源代码中读到这个时。处理消息队列然后分派消息以供回调处理是一个无限循环。

根据这个/sf/answers/363578701/,Handler 和它的 Looper 在同一个线程中运行。

如果主线程出现死循环,岂不是阻塞了整个UI系统?

我知道我一定是傻到错过了什么。但如果有人能透露这背后的秘密,那就太好了。

public static void loop() {
    final Looper me = myLooper();
    if (me == null) {
        throw new RuntimeException("No Looper; Looper.prepare() wasn't called …
Run Code Online (Sandbox Code Playgroud)

multithreading android handler looper android-looper

3
推荐指数
1
解决办法
4449
查看次数

Handler是一个线程与否,以及Looper与处理程序和线程的作用是什么?

处理程序是一个线程与否?如果是,我们如何从此Handler(线程)更新UI?

如果我们使用Looper概念,那么它是可能的.在这种情况下,它适用于任何线程吗?我对这些Threads,Handlers和Loopers非常困惑.有人可以用一个例子解释一下吗?处理程序是一个线程与否?如果是,我们如何从此Handler(线程)更新UI.

如果我们使用Looper概念,那么它可能适用于任何线程吗?我对这个Thread,Handler和Looper非常困惑.有人可以用一个例子解释一下吗?


问题" 线程和处理程序之间的区别是什么 "只是关于处理程序和线程,但不解释Loopers及其行为.并且接受的答案是"另一方面处理程序是允许您与UI线程通信的后台线程(更新UI)",但根据下面的"ben75"的答案,处理程序不是线程.因此,我不认为这是该问题的重复.

multithreading android android-handler android-looper

2
推荐指数
1
解决办法
875
查看次数

来自非 Activity 类的处理程序

我们可以执行吗

handler.postDelayed(runnable,400)
Run Code Online (Sandbox Code Playgroud)

来自非Activity阶级?

我有一个控制器类,假设它是一个适配器。我们可以在那里使用吗Handler

我尝试使用断点调试我的应用程序,但控制未到达

handler.postDelayed(runnable,400)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解决这个问题吗?

其实我用的是OCR。如果进行了某些匹配,我想自动返回到我的主要活动。我想它是一个循环器。我还需要拍摄它的照片。为此,我需要使用处理程序。

java multithreading android android-handler android-looper

2
推荐指数
1
解决办法
1815
查看次数

在 FusedLocationProviderClient.requestLocationUpdates() 中使用 Looper.myLopper() 或 null 是同一件事吗?

我正在创建一个位置跟踪应用程序,我正在使用该FusedLocationProviderClient.requestLocationUpdates()方法。它的参数之一需要一个Looper对象,我不完全确定它是如何工作的。现在我只是传递null给它并且它按预期工作。

经过研究,我了解到 UI 线程基本上是一个HandlerThread已经有自己的 Looper 对象的线程(我知道基本的东西,但意识到有点晚了)。Looper.myLooper(所以这次我使用) 而不是 null,它仍然有效。

private void getLocationUpdates(){
//checkSelfPermissions
fusedLocationProviderClient
.requestLocationUpdates(locationRequest,locationCallback,Looper.myLooper());
}
Run Code Online (Sandbox Code Playgroud)

文档说传递null会在调用线程上执行 locationCallback。那么当我使用Looper.myLooper(). 从任何线程调用时两者都有相同的效果还是我遗漏了一些东西?

android android-looper fusedlocationproviderclient

2
推荐指数
1
解决办法
7390
查看次数