代码之家  ›  专栏  ›  技术社区  ›  Lee Armstrong

AsyncTask和Looper.prepare()错误

  •  31
  • Lee Armstrong  · 技术社区  · 15 年前

    我有以下代码

    class OverlayTask extends AsyncTask<Void, Void, Void> {
        @Override
        public void onPreExecute() {
    
            if (sites != null) {
                myMapView.getOverlays().remove(sites);
                myMapView.invalidate();
                sites = null;
            }
        }
    
        @Override
        public Void doInBackground(Void... unused) {
                grabShipsWithLocation();
                return (null);
        }
    
        @Override
        public void onPostExecute(Void unused) {
            myMapView.getOverlays().add(sites);
            myMapView.invalidate();
            isLoading = false;
        }
    }
    

    这在一些测试设备上似乎工作得很好,但是我看到开发人员控制台上出现了很多错误。我好像不知道为什么要把这个活套放在哪里。prepare()。需要吗?

    java.lang.ExceptionInInitializerError
    at com.test.appname.FinderMain$1.gotLocation(FinderMain.java:286)
    at com.test.appname.MyLocation$GetLastLocation.run(MyLocation.java:89)
    at java.util.Timer$TimerImpl.run(Timer.java:289)
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    at android.os.Handler.<init>(Handler.java:121)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
    at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
    

    按请求MyLocation.java

        class GetLastLocation extends TimerTask {
        @Override
        public void run() {
             lm.removeUpdates(locationListenerGps);
             lm.removeUpdates(locationListenerNetwork);
    
             Location net_loc=null, gps_loc=null;
             if(gps_enabled)
                 gps_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
             if(network_enabled)
                 net_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    
             //if there are both values use the latest one
             if(gps_loc!=null && net_loc!=null){
                 if(gps_loc.getTime()>net_loc.getTime())
                     locationResult.gotLocation(gps_loc);
                 else
                     locationResult.gotLocation(net_loc);
                 return;
             }
    
             if(gps_loc!=null){
                 locationResult.gotLocation(gps_loc); //Line 89
                 return;
             }
             if(net_loc!=null){
                 locationResult.gotLocation(net_loc);
                 return;
             }
             locationResult.gotLocation(null);
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  95
  •   Timo Ohr    15 年前

    长话短说:

    AsyncTask 内部使用 Handler . 处理程序基本上允许您发布 Runnables 从处理程序被分配到的线程上的另一个线程,在这种情况下 异步任务 总是调用它的线程。这只适用于具有 Looper 准备好了。

    有关详细信息,请参见 http://developer.android.com/reference/android/os/Handler.html

    短篇故事:

    只需将每个呼叫包装到 FinderMain$1.gotLocation 或创造 异步任务 在它的内部 Runnable ,并将其发布到 经办人 绑定到UI线程,如下所示:

    class GetLastLocation extends TimerTask {
        private Handler mHandler = new Handler(Looper.getMainLooper());
    
        @Override
        public void run() {
           // ...
           mHandler.post(new Runnable() {
              public void run() {
                  locationResult.gotLocation(null);
              }
           });
           // ...
         }
    }
    
        2
  •  18
  •   Nilesh Tupe    14 年前

    我试过了…它成功了,希望它能帮助你。。

    protected class Asyctast extends AsyncTask<String, Integer, Integer>
    {
    
        @Override
        protected Integer doInBackground(String... params) {
            // TODO Auto-generated method stub
    
    
            Log.d("Asynctask", ""+params);  
    Looper.prepare();   
    
             ImageThumbnailsActivity m = new ImageThumbnailsActivity();
    
                Toast.makeText(ImageThumbnailsActivity.this,""+params ,Toast.LENGTH_SHORT).show();
                final Dialog dialog_options = new Dialog(ImageThumbnailsActivity.this);
                dialog_options.setContentView(R.layout.option);
                dialog_options.show();
            Looper.loop();
            return null;
        }       
    }
    
    推荐文章