以下来自于两位好几年Android经验对NetworkOnMainThread的疑惑不解,苦查无果,某认为问题出在回调上的人员,询问起本楼主时,本楼主非常无奈,信笔直书所回赠的基础性解答。现公开发表。
"感觉你们对我之前说的"主线程调网络"不是很理解,现解释澄清下。调不是指的回调,很明显是请求。一句话解释就是"网络请求没有异步"。请求响应机制中,以主线程为参考系,很明显请求必须是要异步执行的,而响应的执行同步或异步均可,响应的二次处理异步执行更好,响应的最终回调同步执行更好。但凡NetworkOnMainThread,与响应都不可能有关系。对于请求要 异步执行,并不是说请求一定要异步去请求,而是说请求一定要异步执行,同步请求异步执行就是搭建网络层的一个很好的方式。具体说来,请求的方式在大的架构上只有外异内同,外同 内异,外异内异三种方式。如果以"外同内同"的方式去请求的话,3.0以上手机就会报NetworkOnMainThread例外,这就是报错的本质原因。一般app所使用的要么是外同内异方式,要么是外 异内同方式。外同内异比外异内同更容易阻塞,外异内同比外同内异有更多的内存消耗。在搭建两级中转站实现不同层级宏观调控的架构中,很明显,外异内同要比外同内异要好。另需注 意,线程是一个参考系,使用不同的参考系,结论的本质是不会变的,只是说法就变了。以数学科学的方式来看,科学的参考系是依附线程,其为动态;主线程是易观察的静态参考系。如 异步回调与同步执行并不矛盾,只是参考系不一样。"
以上论述献给Android网络模块的入门开发人员,与好几年Android经验仍对网络一知半解的开发人员作为参考。
另作注:以上论述非Android特有机制,与所有开发语言皆是共通的,但大同下仍有小异。
共同学习,写下你的评论
评论加载中...
作者其他优质文章