2012-05-17 5 views
0

У меня есть ошибка на некоторых устройствах, которые иногда дают ANR при запуске нового действия. У меня небольшая степень задержки на моем устройстве (Samsung Galaxy S2), но я никогда не получаю ANR. Другие устройства, которые иногда получают ANR: HTC Desire HD и Xperia (что я знаю). Im, думая, что это может быть что-то из-за интенсивной работы процессора, я делаю то, что заставляет старые телефоны отставать больше, чем более новые, но я не знаю. Я использую Asynctask для загрузки всего тяжелого материала, а поток ui действительно не делает много.ANR на некоторых устройствах при запуске деятельности

Heres код

создать отдельный поток здесь, чтобы получить доступ к общим предпочтениям.

@Override 
    protected void onResume() { 
     super.onResume(); 
     sound = false; 
     Thread prefThread = new Thread(new Runnable(){ 
      public void run(){ 
       SharedPreferences prefs = getSharedPreferences(SharedPrefValues.OPTION_PREF, Context.MODE_PRIVATE); 
       sound = prefs.getBoolean("sound", true); 
       String difficulty = prefs.getString(SharedPrefValues.DIFFICULTY, SharedPrefValues.DIF_MEDIUM); 
       prefs = getSharedPreferences(SharedPrefValues.HIGHSCORE_PREF, Context.MODE_PRIVATE); 
       for(int i = 0; i < mapPnl.buttons.size(); i++) 
        mapPnl.SetRank(mapPnl.buttons.get(i), prefs.getString(SharedPrefValues.HIGHSCORE_RANK_NAME + difficulty + mapPnl.buttons.get(i).getName(), SharedPrefValues.RANK_NOT_OK)); 

      } 
     }); 
     prefThread.start(); 
     mapPnl.speedX = 0; 
    } 

bgTask - это AsyncTask.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     Display display = getWindowManager().getDefaultDisplay(); 
     screenSize = new Point(); 
     screenSize.x = display.getWidth(); 
     screenSize.y = display.getHeight(); 


     mapPnl = new MapPnl(this); 

     LoadBitmapsStuff bgTask = new LoadBitmapsStuff(this); 
     bgTask.execute(); 

     addContentView(mapPnl, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    } 

Это SurfaceView, что привлекает все и заботится о onTouchEvents

private class MapPnl extends SurfaceView implements SurfaceHolder.Callback{ 
... 
public MapPnl(Context context) { 
      super(context); 
      getHolder().addCallback(this); 

      buttons = new ArrayList<ButtonMap>(); 

      posX = 0; 
      speedX = 0; 
      maxX = 0; 

      drawThread = new DrawThread(getHolder()); 
      drawThread.setRunning(true); 
     } 
.... 
} 

Я начинаю drawThread в surfaceCreated

public void surfaceCreated(SurfaceHolder arg0) { 
     if(drawThread.getState() == Thread.State.NEW) 
      drawThread.start(); 
     else if(drawThread.getState() == Thread.State.TERMINATED){ 
      drawThread = new DrawThread(getHolder()); 
      drawThread.setRunning(true); 
      drawThread.start(); 
     } 
    } 

Surfacedestroyed от руководства на веб-сайте

public void surfaceDestroyed(SurfaceHolder arg0) { 
     boolean retry = true; 
     drawThread.setRunning(false); 
     while (retry) { 
      try { 
       drawThread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // we will try it again and again... 
      } 
     } 

    } 

Я думаю, что это важный код. Насколько я знаю, UIthread работает только через эти части, которые я показал (может быть, не ondestroy, но я читал, что у кого-то была проблема с этим в другом потоке). И это должно работать довольно быстро в большинстве систем.

В drawthread отображается только текст, который говорит «загрузка», пока не будет запущена asyncTask. Поэтому, когда все загружено и нарисовано, пользователь начинает касаться экрана, и когда появляется ANR. Какие-нибудь советы?

Обновление (12-05-18): Мне удалось получить логарифм от эмулятора. Я использовал медленный компаратор, когда я использовал быстрый компаратор, ANR не появился.

PID 860 является деятельность

03-31 01:41:03.453: I/Process(71): Sending signal. PID: 860 SIG: 3 
03-31 01:41:03.453: I/dalvikvm(860): threadid=3: reacting to signal 3 
03-31 01:41:03.672: I/dalvikvm(860): Wrote stack traces to '/data/anr/traces.txt' 
03-31 01:41:03.672: I/Process(71): Sending signal. PID: 71 SIG: 3 
03-31 01:41:03.682: I/dalvikvm(71): threadid=3: reacting to signal 3 
03-31 01:41:03.992: I/dalvikvm(71): Wrote stack traces to '/data/anr/traces.txt' 
03-31 01:41:03.992: I/Process(71): Sending signal. PID: 381 SIG: 3 
03-31 01:41:03.992: I/dalvikvm(381): threadid=3: reacting to signal 3 
03-31 01:41:04.212: I/Process(71): Sending signal. PID: 349 SIG: 3 
03-31 01:41:04.212: I/dalvikvm(349): threadid=3: reacting to signal 3 
03-31 01:41:04.322: I/dalvikvm(349): Wrote stack traces to '/data/anr/traces.txt' 
03-31 01:41:04.332: I/Process(71): Sending signal. PID: 664 SIG: 3 
03-31 01:41:04.364: I/dalvikvm(664): threadid=3: reacting to signal 3 
03-31 01:41:04.542: I/Process(71): Sending signal. PID: 364 SIG: 3 
03-31 01:41:04.612: I/dalvikvm(364): threadid=3: reacting to signal 3 
03-31 01:41:04.744: I/Process(71): Sending signal. PID: 371 SIG: 3 
03-31 01:41:04.953: I/Process(71): Sending signal. PID: 822 SIG: 3 
03-31 01:41:05.162: I/Process(71): Sending signal. PID: 139 SIG: 3 
03-31 01:41:05.162: I/dalvikvm(139): threadid=3: reacting to signal 3 
03-31 01:41:05.221: I/dalvikvm(822): threadid=3: reacting to signal 3 
03-31 01:41:05.292: I/dalvikvm(371): threadid=3: reacting to signal 3 
03-31 01:41:05.312: I/dalvikvm(139): Wrote stack traces to '/data/anr/traces.txt' 
03-31 01:41:05.402: E/ActivityManager(71): ANR in se.blogspot.developingjsa.view (se.blogspot.developingjsa.view/.FirstMenu) 
03-31 01:41:05.402: E/ActivityManager(71): Reason: keyDispatchingTimedOut 
03-31 01:41:05.402: E/ActivityManager(71): Load: 1.79/1.63/1.31 
03-31 01:41:05.402: E/ActivityManager(71): CPU usage from 5383ms to 64ms ago: 
03-31 01:41:05.402: E/ActivityManager(71): elopingjsa.view: 51% = 49% user + 1% kernel/faults: 36 minor 7 major 
03-31 01:41:05.402: E/ActivityManager(71): system_server: 44% = 41% user + 3% kernel/faults: 133 minor 1 major 
03-31 01:41:05.402: E/ActivityManager(71): adbd: 1% = 0% user + 0% kernel 
03-31 01:41:05.402: E/ActivityManager(71): m.android.phone: 1% = 0% user + 0% kernel/faults: 112 minor 
03-31 01:41:05.402: E/ActivityManager(71): ronsoft.openwnn: 0% = 0% user + 0% kernel/faults: 22 minor 
03-31 01:41:05.402: E/ActivityManager(71): com.svox.pico: 0% = 0% user + 0% kernel/faults: 7 minor 
03-31 01:41:05.402: E/ActivityManager(71): logcat: 0% = 0% user + 0% kernel 
03-31 01:41:05.402: E/ActivityManager(71): qemud: 0% = 0% user + 0% kernel 
03-31 01:41:05.402: E/ActivityManager(71): id.defcontainer: 0% = 0% user + 0% kernel/faults: 6 minor 
03-31 01:41:05.402: E/ActivityManager(71): ackageinstaller: 0% = 0% user + 0% kernel/faults: 5 minor 
03-31 01:41:05.402: E/ActivityManager(71): TOTAL: 100% = 91% user + 8% kernel + 0% irq + 0% softirq 
+0

Что говорит logcat? –

+0

Я не смог проверить эти устройства с включенным adb и logcat:/ –

+0

Что? у вас есть logcat из эмулятора, а также ... –

ответ

0

Его теперь решена.

Мне удалось получить трассировку стека с этих устройств, используя игру Google. Оказывается, это не что-то не так с кодом, который я опубликовал там.

Я использовал код из учебника (http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html). Этот код пытался получить surfaceHolder из drawThread каждый раз, когда произошел onTouchEvent.

Я предполагаю, что иногда drawThread находился внутри его цикла и не мог освободить поверхностьHolder, когда UiTread пытался ее захватить, в результате получился ANR.

+0

Поздравляем с исправлением! Когда вы в состоянии, пожалуйста, отметьте свой ответ как «принятый» (используя зеленую галочку), чтобы другие узнали о вашем успехе. Cheers ~ –

+0

Спасибо :) Я не мог принять его до завтра. Сделаю это тогда :) –

 Смежные вопросы

  • Нет связанных вопросов^_^