AsyncHttpClient放在子线程执行时抛出异常的解决方法

简介: AsyncHttpClient放在子线程执行时抛出异常的解决方法

我们的初衷是想在Android每隔一秒get或post一次,但是get/post的代码放在计时器/子线程里就报错了。

原方法

try {

new Thread(new Runnable() {
@Override
public void run() {
//执行AsyncHttpClient的get或post函数

                                   funHttp();

}
}).start();
} catch (Exception e) {
e.printStackTrace();
}

此时,会抛出异常:

java.lang.IllegalArgumentException: Synchronous ResponseHandler used in AsyncHttpClient. You should create your response handler in a looper thread or use SyncHttpClient instead.

原因是:AsyncHttpClient本事是异步机制,但是同步的ResponseHandler用在了异步的http客户端上,你需要给你的线程创建一个looper或者使用SyncHttpClient。

解决方法是添加一个handle。

final Handler m_handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.arg1 == 0) {
//执行AsyncHttpClient的get或post函数
funHttp();
}
}
};

try {
new Thread(new Runnable() {
@Override
public void run() {
Message msg = m_handler.obtainMessage();
msg.arg1 = 0;
m_handler.sendMessage(msg);
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}

相关文章
|
1月前
|
监控 API
Hook 线程与捕获线程执行异常
【10月更文挑战第11天】Hook 线程和捕获线程执行异常是多线程编程中不可或缺的技术。通过深入理解和掌握这些方法,我们可以提高程序的稳定性和可靠性,更好地应对各种异常情况。同时,在实际应用中要注意平衡性能和准确性,制定合理的异常处理策略,以确保程序的正常运行。
30 1
|
1月前
|
监控 Java
捕获线程执行异常的多种方法
【10月更文挑战第15天】捕获线程执行异常的方法多种多样,每种方法都有其特点和适用场景。在实际开发中,需要根据具体情况选择合适的方法或结合多种方法来实现全面有效的线程异常捕获。这有助于提高程序的健壮性和稳定性,减少因线程异常带来的潜在风险。
22 1
|
4月前
|
Java Spring 容器
什么情况下会导致@Async异步方法会失效?
什么情况下会导致@Async异步方法会失效?
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
539 0
|
6月前
|
Java
主线程等待子线程执行完毕再执行的几种方式
主线程等待子线程执行完毕再执行的几种方式
128 0
主线程等待子线程执行完毕再执行方法
主线程等待子线程执行完毕再执行方法
182 0
|
网络协议 C# 计算机视觉
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
关于 C#调用C库Dll,有回调函数时,只执行一次回调函数就直接挂掉 的解决方法
如何实现不论是否发生异常都必须执行 使用关键字finally finally: 我们有一些场景 需要保证代码无论是否异常都要执行 需要放到finally里
如何实现不论是否发生异常都必须执行 使用关键字finally finally: 我们有一些场景 需要保证代码无论是否异常都要执行 需要放到finally里
|
C#
WPF异常捕获三种处理 UI线程, 全局异常,Task异常
原文:WPF异常捕获三种处理 UI线程, 全局异常,Task异常 protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private void RegisterEvents(){//TaskScheduler.
2534 0