安卓三种线程同步方式:1. Thread+Handler 2. Handler+HandlerThread 3. AnsyncTask

本文介绍了一种在Android应用中使用不同方法实现UI更新的技术,包括使用AsyncTask进行后台任务处理并更新UI,利用HandlerThread执行长时间运行的任务,以及通过简单的Thread结合Handler来达到同样的目的。
public class MainActivity extends AppCompatActivity {
    Handler mChildHandler;
    HandlerThread mHandlerThread;
    Handler mHandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1. AsyncTask
        new ImageAsyncTask().execute();
        /*2. HandlerThread
        mHandler = new Handler();
        mHandlerThread = new HandlerThread("handlerThread");
        mHandlerThread.start();
        mChildHandler = new Handler(mHandlerThread.getLooper());
        mChildHandler.post(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            findViewById(R.id.imageview).setVisibility(View.VISIBLE);
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });*/
        /*3. Thread+Handler
        new ChildThread().start();*/
    }

    @Override
    protected void onResume() {
        super.onResume();

    }

    class ImageAsyncTask extends AsyncTask<String, Integer, Boolean>{

        @Override
        protected Boolean doInBackground(String... params) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            findViewById(R.id.imageview).setVisibility(View.VISIBLE);
        }
    }

    class ChildThread extends Thread{
        @Override
        public void run() {
            super.run();
            try {
                sleep(2000);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        findViewById(R.id.imageview).setVisibility(View.VISIBLE);
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
15826: 11-01 18:28:03.755 1736 17030 D OplusZoomToCanvasBaseAnimationState: setState:4, caller=com.android.server.wm.OplusZoomToCanvasOnFullAnimationState.prepareAnimationSource:216 com.android.server.wm.OplusZoomToCanvasOnFullAnimationState$1.handleMessage:183 android.os.Handler.dispatchMessage:112 android.os.Looper.loopOnce:288 android.os.Looper.loop:393 android.os.HandlerThread.run:85 <bottom of call stack> <bottom of call stack> 行 15828: 11-01 18:28:03.755 1736 17030 D OplusZoomToCanvasBaseAnimationState: sendStateMessage:6 行 15829: 11-01 18:28:03.755 1736 17030 D OplusZoomToCanvasBaseAnimationState: sendStateMessage:14 行 15833: 11-01 18:28:03.756 1736 17030 D OplusZoomToCanvasBaseAnimationState: setState:5, caller=com.android.server.wm.OplusZoomToCanvasOnFullAnimationState.changeToState:520 com.android.server.wm.OplusZoomToCanvasOnFullAnimationState$1.handleMessage:188 android.os.Handler.dispatchMessage:112 android.os.Looper.loopOnce:288 android.os.Looper.loop:393 android.os.HandlerThread.run:85 <bottom of call stack> <bottom of call stack> 行 16601: 11-01 18:28:04.133 1736 1818 D OplusFlexibleWindowAnimationState: handleVanishedTask:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator} state:0 firstTask:Task{8a12439 #1497 type=standard A=10116:com.google.android.dialer} secondaryTask:Task{92e105f #642 type=standard A=10160:com.android.chrome} 行 16606: 11-01 18:28:04.134 1736 1818 D OplusZoomToCanvasBaseAnimationState: resetIfTaskVanished:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator},mTask:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator},mAnimationHandler:Handler (com.android.server.wm.OplusZoomToCanvasOnFullAnimationState$1) {8bb51a3} 行 16644: 11-01 18:28:04.137 1736 1818 D OplusFlexibleWindowAnimationState: handleVanishedTask:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator} state:0 firstTask:Task{8a12439 #1497 type=standard A=10116:com.google.android.dialer} secondaryTask:Task{92e105f #642 type=standard A=10160:com.android.chrome} 行 16648: 11-01 18:28:04.137 1736 1818 D OplusZoomToCanvasBaseAnimationState: resetIfTaskVanished:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator},mTask:Task{d144ee0 #19050 type=standard A=10182:com.coloros.calculator},mAnimationHandler:Handler (com.android.server.wm.OplusZoomToCanvasOnFullAnimationState$1) {8bb51a3} 结合堆栈解释下
最新发布
11-04
W Watchdog: android.fg annotated stack trace: 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.MessageQueue.nativePollOnce(Native Method) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.MessageQueue.next(MessageQueue.java:335) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Looper.loopOnce(Looper.java:162) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Looper.loop(Looper.java:294) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.HandlerThread.run(HandlerThread.java:67) 10-07 19:54:54.650 1555 1753 W Watchdog: at com.android.server.ServiceThread.run(ServiceThread.java:46) 10-07 19:54:54.650 1555 1753 W Watchdog: main annotated stack trace: 10-07 19:54:54.650 1555 1753 W Watchdog: at com.android.server.wm.ActivityTaskManagerService.getTasks(ActivityTaskManagerService.java:2408) 10-07 19:54:54.650 1555 1753 W Watchdog: - waiting to lock <0x0756e798> (a com.android.server.wm.WindowManagerGlobalLock) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.app.ActivityTaskManager.getTasks(ActivityTaskManager.java:413) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.app.ActivityTaskManager.getTasks(ActivityTaskManager.java:380) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.app.ActivityManager.getRunningTasks(ActivityManager.java:2798) 10-07 19:54:54.650 1555 1753 W Watchdog: at com.mediatek.mbrainlocalservice.MBrainLocalService.getDisplayIdForApp(MBrainLocalService.java:380) 10-07 19:54:54.650 1555 1753 W Watchdog: at com.mediatek.mbrainlocalservice.MBrainLocalService.notifyAppSwitch(MBrainLocalService.java:415) 10-07 19:54:54.650 1555 1753 W Watchdog: at com.mediatek.mbrainlocalservice.MBrainLocalService.-$$Nest$mnotifyAppSwitch(Unknown Source:0) 10-07 19:54:54.650 1555 1753 W Watchdog: at com.mediatek.mbrainlocalservice.MBrainLocalService$1$1.run(MBrainLocalService.java:183) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Handler.handleCallback(Handler.java:958) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Handler.dispatchMessage(Handler.java:99) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Looper.loopOnce(Looper.java:205) 10-07 19:54:54.650 1555 1753 W Watchdog: at android.os.Looper.loop(Looper.java:294) 10-07 19:54:54.651 1555 1753 W Watchdog: at com.android.server.SystemServer.run(SystemServer.java:988) 10-07 19:54:54.651 1555 1753 W Watchdog: at com.android.server.SystemServer.main(SystemServer.java:675) 10-07 19:54:54.651 1555 1753 W Watchdog: at java.lang.reflect.Method.invoke(Native Method) 10-07 19:54:54.651 1555 1753 W Watchdog: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) 10-07 19:54:54.651 1555 1753 W Watchdog: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1060)
10-15
Binder : Outgoing transactions from this process must be FLAG_ONEWAY 07-24 09:23:01.475 1200 1274 E Binder : java.lang.Throwable 07-24 09:23:01.475 1200 1274 E Binder : at android.os.BinderProxy.transact(BinderProxy.java:541) 07-24 09:23:01.475 1200 1274 E Binder : at komect.aisoho.cloudcomputer.IHYPackageDeletedCallback$Stub$Proxy.packageDeleted(IHYPackageDeletedCallback.java:125) 07-24 09:23:01.475 1200 1274 E Binder : at com.android.server.hra.HYManagerService.requestUnInstall(HYManagerService.java:210) 07-24 09:23:01.475 1200 1274 E Binder : at com.android.server.pm.DeletePackageHelper.deletePackageX(DeletePackageHelper.java:359) 07-24 09:23:01.475 1200 1274 E Binder : at com.android.server.pm.DeletePackageHelper.lambda$deletePackageVersionedInternal$4$com-android-server-pm-DeletePackageHelper(DeletePackageHelper.java:785) 07-24 09:23:01.475 1200 1274 E Binder : at com.android.server.pm.DeletePackageHelper$$ExternalSyntheticLambda4.run(Unknown Source:22) 07-24 09:23:01.475 1200 1274 E Binder : at android.os.Handler.handleCallback(Handler.java:942) 07-24 09:23:01.475 1200 1274 E Binder : at android.os.Handler.dispatchMessage(Handler.java:99) 07-24 09:23:01.475 1200 1274 E Binder : at android.os.Looper.loopOnce(Looper.java:201) 07-24 09:23:01.475 1200 1274 E Binder : at android.os.Looper.loop(Looper.java:288) 07-24 09:23:01.475 1200 1274 E Binder : at android.os.HandlerThread.run(HandlerThread.java:67) 07-24 09:23:01.475 1200 1274 E Binder : at com.android.server.ServiceThread.run(ServiceThread.java:44)
07-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值