AndroidでUIを更新する2つの方法
3778 ワード
Androidの開発過程では、インタフェースのUIを更新する必要があることが多い.一方、UIの更新は、UIスレッドの更新であるメインスレッドによって更新される.プライマリラインスレッド以外のスレッドでページ表示を直接更新すると、エラーが発生することがあります.放出異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
このビュー階層(view hierachy)を作成したスレッドのみがビューを変更できます(view)
あまり話さないで、次のコードを貼ってください.
方法1:
Activity.onCreate(Bundle savedInstanceState)でHandlerクラスのインスタンスを作成し、このHandlerインスタンスのhandleMessageコールバック関数で更新インタフェース表示の関数を呼び出します.
インタフェース: public class MainActivity extends Activity { private EditText UITxt; private Button updateUIBtn; private UIHandler UIhandler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); UITxt = (EditText)findViewById(R.id.ui_txt); updateUIBtn = (Button)findViewById(R.id.update_ui_btn); updateUIBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO Auto-generated method stub UIhandler = new UIHandler(); UIThread thread = new UIThread(); thread.start(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } private class UIHandler extends Handler{ @Override public void handleMessage(Message msg) { //TODO Auto-generated method stub super.handleMessage(msg); Bundle bundle = msg.getData(); String color = bundle.getString("color"); UITxt.setText(color); } } private class UIThread extends Thread{ @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { //TODO Auto-generated catch block e.printStackTrace(); } Message msg = new Message(); Bundle bundle = new Bundle(); bundle.PutString("color","黄色"); msg.setData(bundle); MainActivity.this.UIhandler.sendMessage(msg); } } }
更新後:
方法2:Activityを利用するRunOnUIThread(Runnable)は、uiを更新するコードをRunnableに作成し、uiを更新する必要がある場合、このRunnableオブジェクトをActivity.に渡す.runOnUiThread(Runnable). これによりRunnableペアはuiプログラムで呼び出されます.現在のスレッドがUIスレッドである場合、アクションはすぐに実行されます.現在のスレッドがUIスレッドでない場合、アクションはイベントキューにパブリッシュされたUIスレッドです.
FusionField.currentActivity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), "Update My UI", Toast.LENGTH_LONG).show(); } });
このビュー階層(view hierachy)を作成したスレッドのみがビューを変更できます(view)
あまり話さないで、次のコードを貼ってください.
方法1:
Activity.onCreate(Bundle savedInstanceState)でHandlerクラスのインスタンスを作成し、このHandlerインスタンスのhandleMessageコールバック関数で更新インタフェース表示の関数を呼び出します.
インタフェース:
更新後:
方法2:Activityを利用するRunOnUIThread(Runnable)は、uiを更新するコードをRunnableに作成し、uiを更新する必要がある場合、このRunnableオブジェクトをActivity.に渡す.runOnUiThread(Runnable). これによりRunnableペアはuiプログラムで呼び出されます.現在のスレッドがUIスレッドである場合、アクションはすぐに実行されます.現在のスレッドがUIスレッドでない場合、アクションはイベントキューにパブリッシュされたUIスレッドです.