android–requestLocationUpdates给出错误“无法在未调用Looper.prepare()的线程内创建处理程序

android–requestLocationUpdates给出错误“无法在未调用Looper.prepare()的线程内创建处理程序,第1张

概述我知道存在这样的问题,但我在这里很困惑.我正在使用此代码:publicclassNewWaitAppActivityextendsActivity{privateHandlermHandler;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

我知道存在这样的问题,但我在这里很困惑.我正在使用此代码:

    public class NewWaitAppActivity extends Activity {    private Handler mHandler;    @OverrIDe        public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);        mHandler = new Handler();        lcmgr = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);        Thread LocThread = new Thread(mLocationUpdater);        Log.d("TAG","About to start worker thread");        LocThread.start();}public voID startTimer(VIEw v) {        if (mStartTime == 0L) {            mStartTime = System.currentTimeMillis();            mHandler.removeCallbacks(mUpdateTiMetask);            mHandler.postDelayed(mUpdateTiMetask, 100);        }    }private Runnable mUpdateTiMetask = new Runnable() {        public voID run() {            final long start = mStartTime;            long millis = System.currentTimeMillis() - start;            int seconds = (int) (millis / 1000);            int minutes = seconds / 60;            seconds = seconds % 60;            TextVIEw timer = (TextVIEw) findVIEwByID(R.ID.time_elapsed);            if (seconds < 10) {                timer.setText("" + minutes + ":0" + seconds);            } else {                timer.setText("" + minutes + ":" + seconds);            }            mHandler.postDelayed(this, 1000);        }    };LocationListener locationListener = new LocationListener() {        public voID onLocationChanged(Location location) {          // Called when a new location is found by the network location provIDer.          mStopTimer();        }};private Runnable mLocationUpdater = new Runnable(){        public voID run(){            Log.d("TAG","InsIDe worker thread");            lcmgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);    }};}

我基本上试图在位置更新时停止主线程的计时器.应用程序甚至没有启动,它在运行时给出了上面提到的错误.该错误是由requestLocationUpdates()引起的.好像我不能在onLocationChanged()中调用stopTimer().我怎么能纠正这个?

解决方法:

什么是从你创建的线程调用“lcmgr.requestLocationUpdates(….)”的需要,当它本身是一个基于异步回调的机制?只需在你的活动的onCreate()中移动这个代码,事情就可以了.当你尝试在线程中创建一个根本不打算循环的处理程序(即不调用Looper.prepare的线程,因为你的堆栈跟踪状态也是如此)时,会出现此错误.关于这个错误的更多解释也可以在这个网站上找到.但是这里也给出了一个很好的解释. http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/

总结

以上是内存溢出为你收集整理的android – requestLocationUpdates给出错误“无法在未调用Looper.prepare()的线程内创建处理程序全部内容,希望文章能够帮你解决android – requestLocationUpdates给出错误“无法在未调用Looper.prepare()的线程内创建处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存