【问题标题】:ANR due to deadlock between app and widget?由于应用程序和小部件之间的死锁而导致 ANR?
【发布时间】: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)

看起来像是某种任务死锁。请问大家有什么办法解决这个问题吗?

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    我认为问题在于我在 widgetProvider 的 onUpdate() 函数中做了一个很长的过程。我修改了我的代码以生成一个线程来执行密集的功能,到目前为止,没有用户报告更多的冻结。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      相关资源
      最近更新 更多