2011-08-10 26 views
0

我有一个android应用程序a)在一个线程中执行updateData()函数(查询来自互联网的内容提供程序和HTTP请求),以及b)有一个主屏幕小部件,每次执行相同的updateData()函数30分钟(不在线程中)。由于应用程序和小部件之间的死锁导致的ANR?

一)看起来是这样的:

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); 
    } } 

现在人们是报告在线程中了updateData(上下文)停在同一地点ANR的,一个线程为a)和b)。堆栈跟踪如下所示:

1日例如:

“主” PRIO = 5 TID = 1个的原生| group =“main”sCount = 1 dsCount = 0 s = N obj = 0x40025ad8 self = 0xcd80 | sysTid = 23053 nice = 0 sched = 0/0 cgrp = default handle = -1345017808 | schedstat =(5672943129 29267974835 13299)在android.os.BinderProxy.transact(本机方法)在 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 obj = 0x4629ba88 self = 0x2d1750 | sysTid = 23062 nice = 0 sched = 0/0 cgrp = default handle = 2955408 | schedstat =(53100602 8822875969 600) 在android.os.BinderProxy.transact(本机方法)在 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个NATIVE | group =“main”sCount = 1 dsCount = 0 s = N obj = 0x40020a30 self = 0xcd88 | sysTid = 19319 nice = 0 sched = 0/0 cgrp =默认句柄= -1345026000 at java.net.InetAddress.getaddrinfo(Native Method) java.net.InetAddress.lookupHostByName(InetAddress.java:508)at 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 obj = 0x458842e8 self = 0x245cc0 | sys.did = 20153 nice = 0 sched = 0/0 cgrp = default handle = 2388904 at java.net.InetAddress.getaddrinfo(Native Method)at java.net.InetAddress.lookupHostByName(InetAddress.java:508)...

“Thread-8”prio = 5 tid = 7 NATIVE | group =“main”sCount = 1 dsCount = 0 s = N obj = 0x45867030 self = 0x22c528 | sysTid = 20151 nice = 0 sched = 0/0 cgrp = default handle = 2277944 at java.net.InetAddress.getaddrinfo(Native Method)at java.net。InetAddress.lookupHostByName(InetAddress.java:508)... at com.admob.android.ads.id(AdMobURLConnector.java:153)at com.admob.android.ads.ba(AdRequester.java:206)at com.admob.android.ads.AdView $ b.run(AdView.java:655)

看起来像某种任务的僵局。任何想法如何解决这个人请吗?

回答

0

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