编程问题一:实现子线程和主线程的切换
2017-07-20 10:38
295 查看
最近,我在想我这短暂的程序员生涯有什么让自己眼前一亮的技术呢?有点类似,big question(Who am I?)。
在这里我写一写那些让我有提高和进步的的问题吧。这些问题,原先是先解决后总结出来的。所以大家不要认为我的问题提得“华而不实,原来如此简单”。
测试:
关键点在于使用handler进行切换主子线程。
输出:
在这里我写一写那些让我有提高和进步的的问题吧。这些问题,原先是先解决后总结出来的。所以大家不要认为我的问题提得“华而不实,原来如此简单”。
问题一:写一个类实现提供子线程方法和主线程方法?
问题背景:这个问题是我最近想到的。因为我见过一些框架,可以通过注释什么“@Main”就可以让方法走在主线程,“@SubMain”就可以再子线程。具体哪个框架我就忘了。但是这个确实是一个好问题。而且有点意思,自己想想看咯。实现
在这里,其实我是想到了以前工作项目有一个同事写了一个Service(非Android的Service),这个类就提供了一个跑在子线程的方法。而且敏捷的小伙子也知道我们的AsyncTask其实就实现。所以,我参考了AsyncTask拷贝实现了一个。代码如下:
/** * Created by Ola on 2017/7/19. */ public abstract class SuperThread<Result> { private static final int MESSAGE_POST_RESULT = 0x1; private Thread mThread; private static InternalHandler sHandler; private Result mResult; private static Handler getHandler() { synchronized (AsyncTask.class) { if (sHandler == null) { sHandler = new InternalHandler(); } return sHandler; } } /** * running in sub threads */ protected abstract Result doInBackground(); protected void onResult(Result result) { } public void execute() { mThread = new Thread(new Runnable() { @Override public void run() { mResult = doInBackground(); postResult(mResult); } }); mThread.start(); } private Result postResult(Result result) { Message message = getHandler().obtainMessage( MESSAGE_POST_RESULT, new SuperThreadResult<Result>(this, result)); message.sendToTarget(); return result; } private static class InternalHandler extends Handler { public InternalHandler() { super(Looper.getMainLooper()); } @Override public void handleMessage(Message msg) { SuperThreadResult<?> result = (SuperThreadResult<?>) msg.obj; switch (msg.what) { case MESSAGE_POST_RESULT: result.mSuperThread.onResult(result.mData); break; } } } private static class SuperThreadResult<Data> { final SuperThread mSuperThread; final Data mData; public SuperThreadResult(SuperThread superThread, Data data) { mSuperThread = superThread; mData = data; } } }
测试:
SuperThread<String> superThread = new SuperThread<String>() { @Override protected String doInBackground() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); String result = format.format(date); String name = Thread.currentThread().getName(); Log.i("doInBackground", name); return result; } @Override protected void onResult(String s) { info.setText(s); String name = Thread.currentThread().getName(); Log.i("onResult", name); } }; superThread.execute();
关键点在于使用handler进行切换主子线程。
输出:
相关文章推荐
- 问题:如何实现java主线程等待子线程执行完毕之后再执行?
- java多线程实现主线程等待子线程执行完问题
- Unity3d 多线程编程 线程和主线程(UI)交互实现问题
- C#学习- 通过基于接口的编程来实现数据库的切换
- J2ME编程--实现手机屏幕的切换
- 解决问题的艺术:半小时编程实现照片的反转负冲特效
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 程序员编程艺术:第三章续、Top K算法问题的实现
- 全面了解 Cookie的传递流程、编程实现及安全问题
- 全面了解 Cookie的传递流程、编程实现及安全问题
- C#学习- 通过基于接口的编程来实现数据库的切换
- .NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(4)
- .NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(1)
- 编程实现生产者消费者问题
- 约瑟夫环的问题编程C++实现
- 书写 strcpy 的实现问题及其返回值 体现编程习惯
- SWF文字查询及高亮显示——第三步:实现文字查询高亮显示及解决MovieClip帧切换时关键字无法高亮显示的问题
- 关于无图片实现圆角边框的网页编程问题
- [Unix系统编程]用信号量实现哲学家就餐问题
- Web站点风格切换的实现 - Asp.Net 编程 - TraceFact.Net