【发布时间】:2011-10-24 11:18:21
【问题描述】:
我有一个 android 应用程序,它 a) 在线程中执行 updateData() 函数(查询内容提供者和来自 Internet 的 HTTP 请求等),并且 b) 有一个执行相同 updateData() 函数的主屏幕小部件每 30 分钟一次(不在一个线程中)。
a) 看起来像这样:
public class MoodMain extends Activity{
public void onCreate(...)
{
Thread t = new Thread()
{
public void run()
{
updateData(this);
}
};
t.start();
}
b) 看起来像这样:
public class MoodAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, ...)
{
updateData(context);
} }
现在人们正在报告 ANR,其中线程在 updateData(context) 中的同一位置停止,一个线程用于 a),一个线程用于 b)。堆栈跟踪如下所示:
第一个例子:
“主要”prio=5 tid=1 原生 | group="main" sCount=1 dsCount=0 s=N obj=0x40025ad8 自我=0xcd80 | sysTid=23053 nice=0 sched=0/0 cgrp=默认句柄=-1345017808 | schedstat=( 5672943129 29267974835 13299 ) 在 android.os.BinderProxy.transact(Native Method) 在 android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:370) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:408) ...
“Thread-10”prio=5 tid=9 NATIVE | group="main" sCount=1 dsCount=0 s=N 对象=0x4629ba88 自我=0x2d1750 | sysTid=23062 nice=0 sched=0/0 cgrp=默认句柄=2955408 | schedstat=( 53100602 8822875969 600 ) 在 android.os.BinderProxy.transact(Native Method) 在 android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:370) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:408) 在 android.content.ContentResolver.query(ContentResolver.java:245) ...
第二个例子:
“主要”prio=5 tid=1 原生 | group="main" sCount=1 dsCount=0 s=N obj=0x40020a30 自我=0xcd88 | sysTid=19319 nice=0 sched=0/0 cgrp=默认句柄=-1345026000 在 java.net.InetAddress.getaddrinfo(本机方法)在 java.net.InetAddress.lookupHostByName(InetAddress.java:508) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:280) 在 java.net.InetAddress.getByName(InetAddress.java:310) 在 java.net.InetSocketAddress.(InetSocketAddress.java:110) ...
“Thread-10”prio=5 tid=9 NATIVE | group="main" sCount=1 dsCount=0 s=N 对象=0x458842e8 自我=0x245cc0 | sysTid=20153 nice=0 sched=0/0 cgrp=默认句柄=2388904 在 java.net.InetAddress.getaddrinfo(本机方法)在 java.net.InetAddress.lookupHostByName(InetAddress.java:508) ...
“Thread-8”prio=5 tid=7 NATIVE | group="main" sCount=1 dsCount=0 s=N obj=0x45867030 自我=0x22c528 | sysTid=20151 nice=0 sched=0/0 cgrp=默认句柄=2277944 在 java.net.InetAddress.getaddrinfo(本机方法)在 java.net.InetAddress.lookupHostByName(InetAddress.java:508) ... 在 com.admob.android.ads.i.d(AdMobURLConnector.java:153) 在 com.admob.android.ads.b.a(AdRequester.java:206) 在 com.admob.android.ads.AdView$b.run(AdView.java:655)
看起来像是某种任务死锁。请问大家有什么办法解决这个问题吗?
【问题讨论】: