qymessagehandler和message怎么调用

/ PirateWeinXin
项目语言:None
PirateWeinXin/
22:05:34 +0800 (Thu, 09 Jun 2016)
(C)&&2013&&Alibaba&&Inc.&&All&&rights&&resvered.
Powered by来自企业号开发者接口文档
主动调用是最基本的连接模式,当你的应用调用企业号时,需使用Https协议、Json数据格式、UTF8编码,访问域名为,数据包不需要加密。
在每次主动调用企业号接口时需要带上参数。AccessToken参数由和换取。
是企业号的标识,每个企业号拥有一个唯一的CorpID;Secret是管理组凭证密钥。
系统管理员可通过管理端的权限管理功能创建管理组,分配管理组对应用、通讯录的访问权限。完成后,管理组即可获得唯一的secret。系统管理员可通过权限管理查看所有管理组的secret,其他管理员可通过设置中的开发者凭据查看。
当企业应用调用企业号接口时,企业号后台为根据此次访问的AccessToken,校验访问的合法性以及所对应的管理组的管理权限以返回相应的结果。
注:你应该审慎配置管理组的权限,够用即好,权限过大会增加误操作可能性及信息安全隐患。
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用和来换取,不同的Secret会返回不同的AccessToken。正常情况下AccessToken有效期为7200秒,有效期内重复获取返回相同结果。access_token至少保留512字节的存储空间。
Https请求方式: GET
管理组的凭证密钥
每个secret代表了对应用、通讯录的不同权限;不同的管理组拥有不同的secret。
a)正确的Json返回结果:
"access_token": "accesstoken000001",
"expires_in": 7200
access_token
获取到的凭证。长度为64至512个字节
expires_in
凭证的有效时间(秒)
b)错误的Json返回示例:
"errcode": 43003,
"errmsg": "require https"
当你获取到时,你的应用就可以成功调用企业号后台所提供的各种接口以管理或访问企业号后台的资源或给企业号成员发消息。
为了防止企业应用的程序错误而引发企业号服务器负载异常,默认情况下,每个企业号调用接口都有一定的频率限制,当超过此限制时,调用对应接口会收到相应错误码。
以下是当前默认的频率限制,企业号后台可能会根据运营情况调整此阈值:
每企业调用单个cgi/api不可超过1000次/分,30000次/小时
企业每ip调用接口不可超过20000次/分,600000次/小时
第三方应用提供商每ip调用接口不可超过40000次/分,1200000次/小时
发消息频率
每企业不可超过帐号上限数*30人次/天
创建帐号频率
每企业创建帐号数不可超过帐号上限数*3/月
创建应用频率
每企业最大应用数限制为30个,创建应用次数不可超过30*3/月
创建群聊频率
每个企业号成员(群的创建者)创建群聊个数不可超过500/天
*以上所有频率,按天拦截则被屏蔽一天(自然天),按月拦截则屏蔽一个月(30天,非自然月),按分钟拦截则被屏蔽60秒,按小时拦截则被屏蔽60分钟。
注:身份验证接口的"根据code获取成员信息/user/getuserinfo",若code合法则不受上述频率限制。我的安卓APK
版本升级的时候,覆盖安装导致新版本崩溃,请问是什么原因呢?
我的自己写的安卓APK&,新版本比着老版本,新版本多了百度云推送以及相关JAR包,新版本同时也用到了photo_library库,发布新版本。
在安装新版本的时候:
如果把老版本卸载掉,然后再安装新版本,就不会有任何问题,新版本会运行良好。
但是如果不卸载老版本,直接安装新版本,是覆盖安装的方式安装新版本,结果打开新版本APK的时候,直接异常崩溃。
按照Logcat打印的异常信息看来是因为有一些类找不到。
我猜想肯定是覆盖安装的时候,新版本中的比老版本多出来的一些Jar包没有安装到手机上,
不知道是不是这个原因呢?还是另有隐情?&
究竟该怎么解决呢?
总不能让所有安装我老版本的人把老版本卸载掉,再重新安装新版本吧?
新版本和老版本的签名是一致的。
拜求大神赐予解决方案!!!
打开新版本报出来的异常信息如下:
07-25&19:06:48.139:&E/ActivityManager(174):&exception&bw.write()java.io.IOException:&Transport&endpoint&is&not&connected
07-25&19:06:48.139:&E/AndroidRuntime(22126):&FATAL&EXCEPTION:&main
07-25&19:06:48.139:&E/AndroidRuntime(22126):&java.lang.RuntimeException:&Unable&to&instantiate&application&com.qianyanshangwu.qianyanlife.QYLifeApplication:&
java.lang.ClassNotFoundException:&com.qianyanshangwu.qianyanlife.QYLifeApplication&in&loader&dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.qianyanshangwu.qianyanlife-2.apk]
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.LoadedApk.makeApplication(LoadedApk.java:466)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.ActivityThread.handleBindApplication(ActivityThread.java:3260)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.ActivityThread.access$2200(ActivityThread.java:117)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.ActivityThread$H.handleMessage(ActivityThread.java:969)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.os.Handler.dispatchMessage(Handler.java:99)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.os.Looper.loop(Looper.java:130)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.ActivityThread.main(ActivityThread.java:3683)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&java.lang.reflect.Method.invokeNative(Native&Method)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&java.lang.reflect.Method.invoke(Method.java:507)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&dalvik.system.NativeStart.main(Native&Method)
07-25&19:06:48.139:&E/AndroidRuntime(22126):&Caused&by:&java.lang.ClassNotFoundException:&
com.qianyanshangwu.qianyanlife.QYLifeApplication&in&loader&dalvik.system.PathClassLoader[/system/framework/android.test.runner.jar:/data/app/com.qianyanshangwu.qianyanlife-2.apk]
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&java.lang.ClassLoader.loadClass(ClassLoader.java:551)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&java.lang.ClassLoader.loadClass(ClassLoader.java:511)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.Instrumentation.newApplication(Instrumentation.java:942)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& at&android.app.LoadedApk.makeApplication(LoadedApk.java:461)
07-25&19:06:48.139:&E/AndroidRuntime(22126):& ...&11&more
难道各位大神&&没有遇到过这样的问题吗?
帮顶&楼主解决了吗
安装好新包后,先别打开,先去设置里清楚应用数据,看看是不是好的。
以前有遇到过有点点相似的情况。
期待出错具体原因&和&解决方案
问题到现在依然没有得到解决,请遇到这样问题的大神关注一下,谢谢
隐隐约约感觉到,你没有设置过&android:versionCode&和&&android:versionName
去AndroidManifest里设置下吧,注意新版本的android:versionCode要比老版的要大,是个整数
你可以参考这个,&看对你是否有用,/questions//android-to-unable-to-instantiate-application-java-lang-classnotfoundexception#
重新打包看看
重新打包也没有用,尝试很多方式了,都没有用,不知道是什么原因,感觉很莫民奇妙,APK不签名发布就可以在模拟器上正常运行,但是签名发布以后,就出现异常崩溃了。
如果签名没有问题的话。那就有可能是数据问题,比如sharedpreferences之类的
跟你遇到的问题一模一样
也遇到了这个问题&
即使是一小步也想与你分享MessageHandler (Java(TM) EE 7 Specification APIs)
JavaScript is disabled on your browser.
Interface MessageHandler
All Known Subinterfaces:
public interface MessageHandler
Developers implement MessageHandlers in order to receive incoming messages
during a web socket conversation.
Each web socket session uses no more than one thread at a time to call its MessageHandlers. This means
that, provided each message handler instance is used to handle messages for one web socket session, at most
one thread at a time can be calling any of its methods. Developers who wish to handle messages from multiple
clients within the same message handlers may do so by adding the same instance as a handler on each of the Session
objects for the clients. In that case, they will need to code with the possibility of their MessageHandler
being called concurrently by multiple threads, each one arising from a different client session.
for a usage example.
dannycoward
Nested Class Summary
Nested Classes&
Modifier and Type
Interface and Description
static interface&
This kind of handler is notified by the implementation as it becomes ready
to deliver parts of a whole message.
static interface&
This kind of handler is notified by the container on arrival of a complete message.
Copyright © ,
and/or its affiliates. All Rights Reserved.
Use is subject to下面我们会以android实例来展示对应的功能,程序界面于下:
程序代码如下,后面部分有代码说明:
package&com.android. &&
import&android.app.A &&
import&android.content.C &&
import&android.graphics.C &&
import&android.os.B &&
import&android.os.H &&
import&android.os.L &&
import&android.os.M &&
import&android.util.L &&
import&android.view.V &&
import&android.view.View.OnClickL &&
import&android.widget.B &&
import&android.widget.LinearL &&
import&android.widget.TextV &&
public&class&MessageExample&extends&Activity&implements&OnClickListener&{ &&
private&final&int&WC&=&LinearLayout.LayoutParams.WRAP_CONTENT; &&
private&final&int&FP&=&LinearLayout.LayoutParams.FILL_PARENT; &&
public&TextView& &&
private&EventHandler&mH &&
private&Handler&mOtherThreadHandler=null; &&
private&Button&btn,&btn2,&btn3,&btn4,&btn5,&btn6; &&
private&NoLooperThread&noLooerThread&=&null; &&
private&OwnLooperThread&ownLooperThread&=&null; &&
private&ReceiveMessageThread&receiveMessageThread&=null; &&
private&Context&context&=&null; &&
private&final&String&sTag&=&"MessageExample"; &&
private&boolean&postRunnable&=&false; &&
@Override&&
public&void&onCreate(Bundle&savedInstanceState)&{ &&
&&&&&&&super.onCreate(savedInstanceState); &&
&&&&&&&context&=&this.getApplicationContext(); &&
&&&&&&&LinearLayout&layout&=&new&LinearLayout(this); &&
&&&&&&&layout.setOrientation(LinearLayout.VERTICAL); &&
&&&&&&&btn&=&new&Button(this); &&
&&&&&&&btn.setId(101); &&
&&&&&&&btn.setText("message&from&main&thread&self"); &&
&&&&&&&btn.setOnClickListener(this); &&
&&&&&&&LinearLayout.LayoutParams&param&= &&
&&&&&&&&&new&LinearLayout.LayoutParams(250,50); &&
&&&&&&&param.topMargin&=&10; &&
&&&&&&&layout.addView(btn,&param); &&
&&&&&&&btn2&=&new&Button(this); &&
&&&&&&&btn2.setId(102); &&
&&&&&&&btn2.setText("message&from&other&thread&to&main&thread"); &&
&&&&&&&btn2.setOnClickListener(this); &&
&&&&&&&layout.addView(btn2,&param); &&
&&&&&&&btn3&=&new&Button(this); &&
&&&&&&&btn3.setId(103); &&
&&&&&&&btn3.setText("message&to&other&thread&from&itself"); &&
&&&&&&&btn3.setOnClickListener(this); &&
&&&&&&&layout.addView(btn3,&param); &&
&&&&&&&btn4&=&new&Button(this); &&
&&&&&&&btn4.setId(104); &&
&&&&&&&btn4.setText("message&with&Runnable&as&callback&from&other&thread&to&main&thread"); &&
&&&&&&&btn4.setOnClickListener(this); &&
&&&&&&&layout.addView(btn4,&param); &&
&&&&&&&btn5&=&new&Button(this); &&
&&&&&&&btn5.setId(105); &&
&&&&&&&btn5.setText("main&thread's&message&to&other&thread"); &&
&&&&&&&btn5.setOnClickListener(this); &&
&&&&&&&layout.addView(btn5,&param); &&
&&&&&&&btn6&=&new&Button(this); &&
&&&&&&&btn6.setId(106); &&
&&&&&&&btn6.setText("exit"); &&
&&&&&&&btn6.setOnClickListener(this); &&
&&&&&&&layout.addView(btn6,&param); &&
&&&&&&&tv&=&new&TextView(this); &&
&&&&&&&tv.setTextColor(Color.WHITE); &&
&&&&&&&tv.setText(""); &&
&&&&&&&LinearLayout.LayoutParams&param2&= &&
&&&&&&&&&&new&LinearLayout.LayoutParams(FP,&WC); &&
&&&&&&&param2.topMargin&=&10; &&
&&&&&&&layout.addView(tv,&param2); &&
&&&&&&&setContentView(layout);&&&& &&
&&&receiveMessageThread&=&new&ReceiveMessageThread(); &&
&&&receiveMessageThread.start(); &&
@Override&&
public&void&onClick(View&v)&{ &&
&&&switch(v.getId()){ &&
&&&case&101: &&
Looper& &&
looper&=&Looper.myLooper();&&&&&
mHandler&=&new&EventHandler(looper); &&
mHandler.removeMessages(0); &&
String&obj&=&"This&main&thread's&message&and&received&by&itself!"; &&
Message&m&=&mHandler.obtainMessage(1,&1,&1,&obj); &&
mHandler.sendMessage(m); &&
&&&case&102: &&
postRunnable&=&false; &&
noLooerThread&=&new&NoLooperThread(); &&
noLooerThread.start(); &&
&&&case&103:&& &&
tv.setText("please&look&at&the&error&level&log&for&other&thread&received&message"); &&
ownLooperThread&=&new&OwnLooperThread(); &&
ownLooperThread.start(); &&
&&&case&104:&&&& &&
postRunnable&=&true; &&
noLooerThread&=&new&NoLooperThread(); &&
noLooerThread.start(); &&
&&&case&105:&&&& &&
if(null!=mOtherThreadHandler){ &&
tv.setText("please&look&at&the&error&level&log&for&other&thread&received&message&from&main&thread"); &&
String&msgObj&=&"message&from&mainThread"; &&
Message&mainThreadMsg&=&mOtherThreadHandler.obtainMessage(1,&1,&1,&msgObj); &&
mOtherThreadHandler.sendMessage(mainThreadMsg); &&
&&&case&106: &&
finish(); &&
class&EventHandler&extends&Handler &&
&&&public&EventHandler(Looper&looper)&{ &&
super(looper); &&
&&&public&EventHandler()&{ &&
super(); &&
&&&public&void&handleMessage(Message&msg)&{ &&
switch(msg.what){ &&
case&1: &&
tv.setText((String)msg.obj); &&
case&2: &&
tv.setText((String)msg.obj); &&
noLooerThread.stop(); &&
case&3: &&
Log.e(sTag,&(String)msg.obj); &&
ownLooperThread.stop(); &&
default: &&
Log.e(sTag,&(String)msg.obj); &&
class&NoLooperThread&extends&Thread{ &&
&&&private&EventHandler&mNoLooperThreadH &&
&&&public&void&run()&{ &&
Looper&myLooper,&mainL &&
myLooper&=&Looper.myLooper(); &&
mainLooper&=&Looper.getMainLooper();&&&
String& &&
if(myLooper&==&null){ &&
mNoLooperThreadHandler&=&new&EventHandler(mainLooper); &&
obj&=&"NoLooperThread&has&no&looper&and&handleMessage&function&executed&in&main&thread!"; &&
mNoLooperThreadHandler&=&new&EventHandler(myLooper); &&
obj&=&"This&is&from&NoLooperThread&self&and&handleMessage&function&executed&in&NoLooperThread!"; &&
mNoLooperThreadHandler.removeMessages(0); &&
if(false&==&postRunnable){ &&
Message&m&=&mNoLooperThreadHandler.obtainMessage(2,&1,&1,&obj); &&
mNoLooperThreadHandler.sendMessage(m); &&
Log.e(sTag,&"NoLooperThread&id:"&+&this.getId()); &&
mNoLooperThreadHandler.post(new&Runnable(){&& &&
&&&&@Override&& &&
&&&&public&void&run()&{&& &&
&&&tv.setText("update&UI&through&handler&post&runnalbe&mechanism!"); &&
&&&noLooerThread.stop(); &&
&&&&}&& &&
class&OwnLooperThread&extends&Thread{ &&
&&&private&EventHandler&mOwnLooperThreadH &&
&&&public&void&run()&{ &&
Looper.prepare(); &&
Looper&myLooper,&mainL &&
myLooper&=&Looper.myLooper(); &&
mainLooper&=&Looper.getMainLooper();&&&
String& &&
if(myLooper&==&null){ &&
mOwnLooperThreadHandler&=&new&EventHandler(mainLooper); &&
obj&=&"OwnLooperThread&has&no&looper&and&handleMessage&function&executed&in&main&thread!"; &&
mOwnLooperThreadHandler&=&new&EventHandler(myLooper); &&
obj&=&"This&is&from&OwnLooperThread&self&and&handleMessage&function&executed&in&NoLooperThread!"; &&
mOwnLooperThreadHandler.removeMessages(0); &&
Message&m&=&mOwnLooperThreadHandler.obtainMessage(3,&1,&1,&obj); &&
mOwnLooperThreadHandler.sendMessage(m); &&
Looper.loop(); &&
class&ReceiveMessageThread&extends&Thread{ &&
&&&public&void&run()&{ &&
Looper.prepare(); &&
mOtherThreadHandler&=&new&Handler(){ &&
public&void&handleMessage(Message&msg)&{ &&
&&&&Log.e(sTag,&(String)msg.obj); &&
Looper.loop(); &&
使用Looper.myLooper静态方法可以取得当前线程的Looper对象。 使用mHandler = new EevntHandler(Looper.myLooper()); 可建立用来处理当前线程的Handler对象;其中,EevntHandler是Handler的子类。 使用mHandler = new EevntHandler(Looper.getMainLooper()); 可建立用来处理main线程的Handler对象;其中,EevntHandler是Handler的子类。 主线程发送消息: 在onClick的case 101中创建一个继承自Handler的EventHandler对象,然后获取一个消息,然后通过EventHandler对象调用 sendMessage把消息发送到主线程的MessageQueue中。主线程由系统创建,系统会给它建立一个Looper对象和 MessageQueue,所以可以接收消息。这里只要根据主线程的Looper对象初始化EventHandler对象,就可以通过 EventHandler对象发送消息到主线程的消息队列中。 主线程处理消息: 这里是通过 EventHandler的handleMessage函数处理的,其中收到的Message对象中what值为一的消息就是发送给它的,然后把消息里面附带的字符串在TextView上显示出来。 其他线程发送消息(这里是说不使用Runnable作为callback的消息): 首先 postRunnable设为false,表示不通过Runnable方式进行消息相关的操作。然后启动线程noLooerThread, 然后以主线程的Looper对象为参数建立EventHandler的对象mNoLooperThreadHandler,然后获取一个Message并把一个字符串赋值给它的一个成员obj,然后通过mNoLooperThreadHandler把消息发送到主线程的MessageQueue中。 主线程处理消息: 这里是通过 EventHandler的handleMessage函数处理的,其中收到的Message对象中what值为二的消息就是上面发送给它的,然后把消息里面附带的字符串在TextView上显示出来。 其他线程发送消息: 其他非主线程建立后没有自己的Looper对象,所以也没有MessageQueue,需要给非主线程发送消息时需要建立MessageQueue以便接收消息。下面说明如何给自己建立MessageQueue和Looper对象。从OwnLooperThread的run函数中可以看见有一个 Looper.prepare()调用,这个就是用来建立非主线程的MessageQueue和Looper对象的。 所以这里的发送消息过程是建立线程mOwnLooperThread,然后线程建立自己的Looper和MessageQueue对象,然后根据上面建立的Looper对象建立对应的EventHandler对象mOwnLooperThreadHandler,然后由mOwnLooperThreadHandler建立消息并且发送到自己的MessageQueue里面。 其他线程处理接收的消息: 线程要接收消息需要在run函数中调用Looper.loop(),然后loop函数会从MessageQueue中取出消息交给对应的Handler对象 mOwnLooperThreadHandler处理,在mOwnLooperThreadHandler的handleMessage函数中会把 Message对象中what值为三的消息(上面发送的消息)在Log中打印出来,可以通过Logcat工具查看log。 其他线程发送消息(这里是说使用Runnable作为callback的消息): 首先 postRunnable设为true,表示通过Runnable方式进行消息相关的操作。然后启动线程noLooerThread, 然后以主线程的Looper对象为参数建立EventHandler的对象mNoLooperThreadHandler,然后获取一个Message并把一个字符串赋值给它的一个成员obj,然后通过mNoLooperThreadHandler把消息发送到主线程的MessageQueue中。 主线程处理消息: 主线程收到上面发送的Message后直接运行上面Runnable对象中的run函数进行相应的操作。run函数通过Log打印一个字符串,可以通过Logcat工具查看 log。 主线程发送消息: 这里首先要求线程receiveMessageThread运行(在onCreate函数中完成),并且准备好自己的 Looper和MessageQueue(这个通过ReceiveMessageThread中的run函数中的Looper.prepare()调用完成),然后根据建立的Looper对象初始化Handler对象mOtherThreadHandler。然后在onClick的case 105中由mOtherThreadHandler建立一个消息(消息中有一个字符串对象)并且发送到线程receiveMessageThread中的 MessageQueue中。 其他线程处理接收的消息: 线程要接收消息需要在run函数中调用Looper.loop(),然后loop函数会从MessageQueue中取出消息交给对应的Handler对象mOtherThreadHandler处理,在mOtherThreadHandler的handleMessage函数中会把Message对象中的字符串对象在Log中打印出来,可以通过Logcat工具查看log。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6581次
排名:千里之外
(1)(1)(1)(4)

我要回帖

更多关于 messagehandler 的文章

 

随机推荐