2015-12-10 6 views
1

Может ли кто-нибудь объяснить, когда я поставил поток спать в течение 30 миллисекунд, он обновляет пользовательский интерфейс из фонового потока. но когда я укладываю сон на 300 миллисекунд, он падает, говоря, что вы не можете касаться вида из другого потока. Я ожидаю, что он потерпит крах в обоих случаях, но как-то работает в 30 миллисекунд. Требуется некоторое разъяснение по этому вопросу.Обновление пользовательского интерфейса из другой темы

public class HandlerDemo extends Activity implements Handler.Callback{ 

private static final String TAG = "FFFF"; 
private Handler mHandler = null; 
private Handler mUIHandler = null; 
private HandlerThread backgroundThread = null; 

public static final int BACKGROUND_OPERATION = 10; 
public static final int MAIN_THREAD_OPERATION = 20; 

private TextView asd; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    HandlerThread backgroundThread = new HandlerThread("BACKGROUND_THREAD"); 
    backgroundThread.start(); 
    mHandler = new Handler(backgroundThread.getLooper(), this); 
    mHandler.sendEmptyMessage(BACKGROUND_OPERATION); 

    //  mUIHandler = new Handler(Looper.getMainLooper(), this); 
    //  mUIHandler.sendEmptyMessage(MAIN_THREAD_OPERATION); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mHandler.getLooper().quit(); 
} 

@Override 
public boolean handleMessage(Message message) { 
    Log.d(TAG, Thread.currentThread() + ""); 
    switch (message.what) { 
     case MAIN_THREAD_OPERATION: 
      try { 
       Thread.sleep(30000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      ((TextView) findViewById(R.id.textview)).setText("Updating from UI Handler"); 
      findViewById(R.id.textview).invalidate(); 
      break; 
     case BACKGROUND_OPERATION: 
      try { 
       **Thread.sleep(300);** 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      ((TextView) findViewById(R.id.textview)).setText("Updating from background Handler"); 
      findViewById(R.id.textview).invalidate(); 
      break; 
     default: 
      break; 
    } 

    //  message.recycle(); 
    return true; 
    } 
} 
+2

он должен всегда сбоит при обновлении пользовательского интерфейса из фонового потока – Raghunandan

+0

да действительно. но это не так. Вот в чем вопрос. –

+1

так что если он не сбой, есть ошибка, достаточно ли этого? – pskink

ответ

-2
runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      // do what you want 
     } 
    }); 
+3

Это не то, о чем спрашивает ОП. – Fustigador

+0

@ rz0 Вы даже прочитали вопрос? –

+0

Прошу прощения. Это моя ошибка – rz0

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