Android - 无法在未调用 Looper.prepare() 的线程内创建处理程序 [英] Android - Can't create handler inside thread that has not called Looper.prepare()

查看:17
本文介绍了Android - 无法在未调用 Looper.prepare() 的线程内创建处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Google Maps V2 API 开发一个简单的应用程序只是为了获得基础知识,但我遇到了这个错误:

I am developing a simple application using Google Maps V2 API just to get basics and I am facing this error:

09-09 21:21:41.154: E/AndroidRuntime(3796): FATAL EXCEPTION: Thread-441
09-09 21:21:41.154: E/AndroidRuntime(3796): java.lang.ExceptionInInitializerError
09-09 21:21:41.154: E/AndroidRuntime(3796):  at cz.vongrad.dataSourceLayer.DataMapper.loadLocation(DataMapper.java:111)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at cz.vongrad.dataSourceLayer.DBFacade.loadLocations(DBFacade.java:32)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at cz.vongrad.domainLayer.Controller.loadLocations(Controller.java:94)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at cz.vongrad.locator.MapActivity$1.run(MapActivity.java:199)
09-09 21:21:41.154: E/AndroidRuntime(3796): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-09 21:21:41.154: E/AndroidRuntime(3796):  at android.os.Handler.<init>(Handler.java:121)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
09-09 21:21:41.154: E/AndroidRuntime(3796):  at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
09-09 21:21:41.154: E/AndroidRuntime(3796):  ... 4 more
09-09 21:21:41.164: E/EmbeddedLogger(239): App crashed!

数据映射器:

class LoadLocations extends AsyncTask<String, Void, ArrayList<Friend>>{

        private JSONObject jSONObject;


        @Override
        protected ArrayList<Friend> doInBackground(String... args) {

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("user_name", args[1]));

            jSONObject = jSONParser.makeHttpRequest(args[0], "POST", params);
            Log.d(TAG, jSONObject.toString());

            ArrayList<Friend> tempFriends = new ArrayList<Friend>();

            try {
                if(jSONObject.getInt("success") == 1){

                    JSONArray jsonArray = jSONObject.getJSONArray("users");


                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject o = jsonArray.getJSONObject(i);

                        tempFriends.add(new Friend(o.getString("user_name"), new LatLng(o.getDouble("loc_y"), o.getDouble("loc_x")), false));
                    }

                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return tempFriends;
        }

    }

public ArrayList<Friend> loadLocation(String URL, String userName) throws InterruptedException, ExecutionException {
        return new LoadLocations().execute(URL, userName).get();

    }

地图活动:

public class MapActivity extends Activity implements LocationSource, LocationListener {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}
private Thread loadFriendLocations = new Thread()
    {

        @Override
        public void run() {
            Log.d(TAG, "LastKnownLocation: " + locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER));
            try {
                while(true) {
                    controller.loadLocations(LOAD_LOCATIONS);
                    Log.d(TAG, "Loading new locations");
                    Message msg = uIHandler.obtainMessage();
                    msg.what = ADD_MAP_PIN;
                    uIHandler.sendMessage(msg);

                    sleep(10000);                   
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };

    final Handler uIHandler = new Handler(){
      @Override
      public void handleMessage(Message msg) {

        if(msg.what==ADD_MAP_PIN){

            for (Friend friend : controller.getFriends()) {

                    addMapPin(friend);


            }
        }
        super.handleMessage(msg);
      }
    };

奇怪的是,我可以在我的模拟器 (API 16) 上运行这个应用程序,它运行得很好,但是当我尝试在物理设备 (API 15) 上运行它时,它得到了这个错误.AsyncTask 在单独的类中运行,因此可能会导致此问题.我将不胜感激任何建议.提前致谢.

The weird thing is that I can run this app on my emulator (API 16) and it runs just great but when I try to run it on a physical device (API 15), it gets this error. The AsyncTask is run in separate class, so it might cause this problem. I would appreciate any suggestions. Thanks in advance.

推荐答案

您不能从后台线程执行 AsyncTask.请参阅AsyncTask 文档的线程规则"部分.

You cannot execute an AsyncTask from a background thread. See the "Threading Rules" section of the AsyncTask documentation.

这篇关于Android - 无法在未调用 Looper.prepare() 的线程内创建处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆