我在尝试在后台线程中对 * 回调方法运行 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) 这个错误困扰了我好几个小时.我收到了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
我收到此错误,我的应用程序崩溃:
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();于上面的代码行:
我过去曾遇到过这个问题,但我并没有想太多,因为我只是在尝试使用 IDE。但是,我意识到当我创建一个全新的应用程序时也会出现该错误,即使我没有添加自己的代码,我仍然会收到此错误,我们将不胜感激任何帮助来解决此问题。
到目前为止,我已经尝试在 UI 线程和异步线程上运行方法,但仍然没有运气。
错误:
E/AbstractTracker:无法在未调用 Looper.prepare() 的线程内创建处理程序
D/AppTracker:应用事件:停止
E/AbstractTracker:无法在未调用 Looper.prepare() 的线程内创建处理程序
D/AppTracker:应用事件:开始
我正在使用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) 在尝试进行单元测试时,我无法让 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) 趋势视图模型测试
@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) 今天我阅读了一些关于 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) 处理程序是一个线程与否?如果是,我们如何从此Handler(线程)更新UI?
如果我们使用Looper概念,那么它是可能的.在这种情况下,它适用于任何线程吗?我对这些Threads,Handlers和Loopers非常困惑.有人可以用一个例子解释一下吗?处理程序是一个线程与否?如果是,我们如何从此Handler(线程)更新UI.
如果我们使用Looper概念,那么它可能适用于任何线程吗?我对这个Thread,Handler和Looper非常困惑.有人可以用一个例子解释一下吗?
问题" 线程和处理程序之间的区别是什么 "只是关于处理程序和线程,但不解释Loopers及其行为.并且接受的答案是"另一方面处理程序是允许您与UI线程通信的后台线程(更新UI)",但根据下面的"ben75"的答案,处理程序不是线程.因此,我不认为这是该问题的重复.
我们可以执行吗
handler.postDelayed(runnable,400)
Run Code Online (Sandbox Code Playgroud)
来自非Activity阶级?
我有一个控制器类,假设它是一个适配器。我们可以在那里使用吗Handler?
我尝试使用断点调试我的应用程序,但控制未到达
handler.postDelayed(runnable,400)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
其实我用的是OCR。如果进行了某些匹配,我想自动返回到我的主要活动。我想它是一个循环器。我还需要拍摄它的照片。为此,我需要使用处理程序。
我正在创建一个位置跟踪应用程序,我正在使用该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 ×11
android-looper ×11
unit-testing ×2
fusedlocationproviderclient ×1
handler ×1
java ×1
junit ×1
looper ×1
performance ×1
rx-java2 ×1