2011-08-10 72 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()函數中做了一個很長的過程。我修改了我的代碼以生成一個線程來執行密集的功能,到目前爲止,沒有更多的用戶報告凍結。