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