0

doInBackground() 工作正常.. Looper.loop() 之后的代码将不起作用。在 Looper.Loop() 之后日志不打印并且不执行 onPostExceute()。我需要等到方法 1,2,3 执行。如果没有使用 Looper.prepare(),method1 会发生异常。

@Override
    protected Void doInBackground(Void... params) {
        try {

                if (Looper.myLooper() == null)
                    Looper.prepare();               
                method1();
                method2();
                method3();
                Looper.loop();

                Log.d(TAG,"after loop()");
            } else {
                method4(); //inside asyn task
            }

            Log.d(TAG,"doInBackground end");

        }catch (Exception e) {
            Log.d(TAG,"doInBackground exception "+e);
        }


        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        try {


            Log.d(TAG, "onPostExecute");



            //............

        }catch (Exception e){
            Log.d(TAG,"onPostExecute end");
        }
    }


    @Override
    protected void onPreExecute() {
        //.....
    }
4

1 回答 1

2

Looper.loop 使线程循环永远等待消息队列上的传入事件并运行相关的可运行对象。它永远不应该在 AsyncTask 上调用,它会导致整个 AsyncTask 线程无限循环,从而使所有未来的 AsyncTask 死锁。它应该只在线程上调用,并且只有在您了解如何使用它的情况下。

于 2017-04-19T18:50:13.597 回答