2013-05-10 2 views
0

나는 완전히 새로운 android이고, 작동 가능하고 메인 스레드 외부에서 UI를 업데이트 할 수있는 방법인지 알고 싶다. 내 코드에서부터이 코드에서 알 수있는 것은 아래에 나열되어 있습니다. 전혀 불가능합니다. 하지만, 문제는 입니다. 다른 스레드 인을 사용하여 UI를 업데이트하고 싶습니다. 미리 감사드립니다.메인 스레드 외부의 UI 업데이트

package com.example.app; 

import java.util.Random; 
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.Menu; 
import android.view.View; 
    import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
private Button b; 
public ImageView I1; 
public ImageView I2; 
public ImageView I3; 
public ImageView I4; 
public TextView T; 
public TextView s; 
@Override 

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

I1=new ImageView(this); 
I1=(ImageView) findViewById(R.id.imag1); 
I1.setVisibility(View.INVISIBLE); 

I2=new ImageView(this); 
I2=(ImageView) findViewById(R.id.imag2); 
I2.setVisibility(View.INVISIBLE); 

I3=new ImageView(this); 
I3=(ImageView) findViewById(R.id.imag3); 
I3.setVisibility(View.INVISIBLE); 

I4=new ImageView(this); 
I4=(ImageView) findViewById(R.id.imag4); 
I4.setVisibility(View.INVISIBLE); 

T=(TextView)findViewById(R.id.time); 
s=(TextView)findViewById(R.id.score); 

Thread t=new Thread(new MyThread()); 
t.start(); 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
// Inflate the menu; this adds items to the action bar if it is present. 
getMenuInflater().inflate(R.menu.main, menu); 
return true; 
} 

private class MyThread implements Runnable{ 
Random randomGenerator = new Random(); 
int n; 
public void run(){ 

    while(true){ 
     n=randomGenerator.nextInt(8); 

     if(n==1){ 
      I1.setVisibility(View.VISIBLE); 

     } 
     if(n==2){ 
      I2.setVisibility(View.VISIBLE); 
     } 

     if(n==3){ 
      I3.setVisibility(View.VISIBLE); 
     } 

     if(n==4){ 
      I4.setVisibility(View.VISIBLE); 
     } 
     try { 
      Thread.currentThread().sleep(500); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.getStackTrace(); 
     } 
    } 

    } 




    } 
    } 
+1

의 포스트 방법을 사용할 수 있습니다, 당신의 코드는 설계 결함을 가지고있다. 메인 스레드와 다른 스레드가 UI를 업데이트해서는 안됩니다. 설명서를 읽으 려한다면 귀찮습니다. 그러나 안드로이드는 다른 스레드가 보내고있는 UI에서 UI를 업데이트 할 수있는 도구를 제공하지만 문서를 읽어야 방법을 파악할 수 있습니다. –

+1

특정 문서에 대한 링크를 제게 알려주십시오. –

+1

여기서부터 시작하기 : [Processes and Thread] (http://developer.android.com/guide/components/processes-and-threads.html) –

답변

0

UI 만 업데이트 할 수 있습니다. 스레드가 UI를 업데이트하려는 경우 activity.runOnUiThread()를 사용하십시오.

UI 스레드에서 실행되도록 대기중인 경우 (UI 스레드에서 실행하는 경우) UI가 약간 업데이트 될 수 있습니다. 후에.

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

+0

그러나 sleep 메서드를 사용하여 실행을 일시 중지 할 수는 있습니다. RunOnUIThread() 내부에서 잠자기를 사용하면 주 스레드가 일시 중지되고 이로 인해 문제가 발생합니다. –

+1

이것은 UI 작업의 주요 원칙 중 하나입니다. 최소 시간 동안 UI 스레드를 차단하고 배경 스레드에서 논리를 수행하고 준비된 관련 데이터로 UI 업데이트를 예약하십시오. –

4

사용 activity.runOnUiThread는

Acivity.runOnUiThread(new Runnable() { 
    public void run() { 
     //something here 
    } 
}); 
0

당신은 핸들러의 인스턴스를 사용하여 UI 스레드의 큐 내부의 Runnable를 추가합니까 포스트 방법을 사용해야합니다. 액티비티 안에있는 경우 runOnUiThread를 사용하여 동일한 작업을 수행 할 수있는 "바로 가기"를 사용할 수 있습니다.

2

UI가 아닌 스레드에서 UI를 직접 업데이트 할 수는 없지만 Handler 객체 또는 AsyncTask를 사용하여 UI 스레드와 통신 할 수 있습니다 목적.

AsyncTask를의
  • .doInBackground() 메소드는 비 UI 스레드
  • .onProgressUpdate()에서 실행 그렇게
  • 당신은 publishProgress를 사용할 수 있습니다보기를 변경 할 수 UI 스레드에서 실행
      (: AsyncTask를를 사용하는 가장 convinient 방법) 메서드를 doInBackground() 내부에서 사용하여 .onProgressUpdate에 데이터를 전달합니다.

    죄송합니다. 메소드 이름에 실수가 있으면 죄송합니다. 자세한 내용은 http://developer.android.com/guide/components/processes-and-threads.html을 참조하십시오.

  • 2

    주 스레드 만 UI 요소 (TextView, EditText 등)를 렌더링 할 수 있기 때문에 작업자 스레드는 주 스레드를 업데이트 할 수 없으며 확실히 업데이트하려고 시도하면 예외가 발생합니다.

    myAcitity.runOnUiThread(new Runnable() { 
        public void run() { 
         //here you can update your UI elements because this code is going to executed by main thread 
        } 
    }); 
    

    그렇지 않으면 당신은 안드로이드 및 멀티 스레딩에 대해 자세히 읽어보기 클래스

    myView.post(new Runnable() { 
         public void run() { 
          //here you can update your UI elements because this code is going to executed by main thread 
         } 
        }); 
    
    관련 문제