나는 이것을 시도했다
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
t.setText("Step One: blast egg");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t.setText("Step Two: fry egg");
하지만 어떤 이유로 실행하면 두 번째 텍스트 만 표시됩니다. 나는 그것이 Thread.sleep()
방법 차단 과 관련이 있다고 생각합니다 . 누군가가 “비동기 적으로”타이머를 구현하는 방법을 보여줄 수 있습니까?
감사.
답변
이 답변을 android-discuss Google 그룹에 게시했습니다.
보기에 텍스트를 추가하여 “1 단계 : 달걀 날치기 2 단계 : 달걀 튀김”을 t.appendText("Step Two: fry egg");
표시하는 경우t.setText("Step Two: fry egg");
TextView
시작할 때 “1 단계 : 계란을 튀기십시오”라고 표시되고 나중에 “2 단계 : 계란 튀김”이라고 표시되도록 내용을 완전히 변경하려면 항상
실행 가능한 예제 sadboy가 준
행운을 빕니다
답변
귀하의 onCreate()
방법에는 몇 가지 큰 결함이 있습니다.
1) 활동을 onCreate
준비 합니다- 이 방법이 완료 될 때까지 여기에서 수행하는 작업 은 사용자에게 표시 되지 않습니다 ! 예를 들어 , 마지막 변경 사항 만 그려져 사용자에게 표시되므로 TextView
여기서의 텍스트를 한 번 이상 변경할 수 없습니다!
2) Android 프로그램은 기본적으로 하나의 스레드에서만 실행 됩니다. 따라서 UI를 담당하는 주 스레드 Thread.sleep()
또는 사용하지 마십시오 Thread.wait()
! ( 자세한 내용은 “앱 반응 형 유지” 를 참조하십시오!)
무엇 당신의 초기화 하여 활동의가하는 것은 :
- 이유없이 새
TextView
개체 를 만듭니다t
! - 나중에
TextView
변수에서 레이아웃을 선택합니다t
. - 당신은 텍스트를 설정합니다
t
(하지만 명심하십시오 : 그것은 완료되고 응용 프로그램의 메인 이벤트 루프가 실행 된 후에 만 표시onCreate()
됩니다!) - 메서드 내 에서 10 초 동안 기다립니다. 모든 UI 활동을 중지하고 ANR을 강제로 강제 하므로 절대로 수행해서는 안됩니다 (응용 프로그램이 응답하지 않음, 위 링크 참조).
onCreate
- 그런 다음 다른 텍스트를 설정합니다.이 텍스트는
onCreate()
메서드가 완료되고 다른 여러 활동 수명주기 메서드가 처리 되는 즉시 표시됩니다 !
해결책:
-
텍스트를 한 번만 설정하십시오
onCreate()
. 표시되어야하는 첫 번째 텍스트 여야합니다. -
만들기
Runnable
및Handler
private final Runnable mUpdateUITimerTask = new Runnable() { public void run() { // do whatever you want to change here, like: t.setText("Second text to display!"); } }; private final Handler mHandler = new Handler();
-
이 실행 파일을 가능한 핸들러로 설치하십시오
onCreate()
(하지만 아래 조언을 읽으십시오).// run the mUpdateUITimerTask's run() method in 10 seconds from now mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
조언 : Activity
의 수명주기 를 알고 있어야합니다 ! 당신이 그런 일을한다면 onCreate()
이것은 당신 Activity
이 처음 생성 되었을 때만 일어날 것 입니다 ! Android는 Activity
눈에 보이지 않더라도 더 오랜 시간 동안 살아남을 수 있습니다! 사용자가 다시 “시작”하면-여전히 존재하며-더 이상 첫 번째 텍스트를 볼 수 없습니다!
=> 항상 핸들러를 설치 onResume()
하고 비활성화하십시오 onPause()
! 그렇지 않으면 귀하 Activity
가 전혀 보이지 않을 때 “업데이트”를 받게됩니다 ! 귀하의 경우 다시 활성화되었을 때 첫 번째 텍스트를 다시 보려면 !가 onResume()
아니라 에서 설정해야합니다 onCreate()
.
답변
새 텍스트보기의 첫 번째 줄은 필요하지 않습니다.
t=new TextView(this);
당신은 이것을 할 수 있습니다
TextView t = (TextView)findViewById(R.id.TextView01);
여기에 잠자는 백그라운드 스레드가 예이지만 이것에 더 나은 타이머가 있다고 생각합니다. 다음은 타이머를 대신 사용하는 좋은 예에 대한 링크입니다.
http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Thread thr = new Thread(mTask);
thr.start();
}
Runnable mTask = new Runnable() {
public void run() {
// just sleep for 30 seconds.
try {
Thread.sleep(3000);
runOnUiThread(done);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable done = new Runnable() {
public void run() {
// t.setText("done");
}
};
답변
뿡 빵뀨
String 변수를 사용할 때 “”문자열을 접두사로 사용하거나 명시 적으로 CharSequence로 캐스팅해야한다는 것을 알았습니다.
그래서 대신 :
String Status = "Asking Server...";
txtStatus.setText(Status);
시험:
String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);
또는:
String Status = "Asking Server...";
txtStatus.setText("" + Status);
또는 문자열이 동적이 아니기 때문에 더 좋습니다.
txtStatus.setText("AskingServer...");
답변
귀하의 조언에 따라 “타이머”를 사용하여 TextView의 내용을 전환 / 변경하기 위해 핸들과 실행 파일을 사용하고 있습니다. 어떤 이유로 실행시 앱은 항상 두 번째 단계 ( ‘2 단계 : 계란 튀김’)를 건너 뛰고 마지막 (세 번째) 단계 만 표시합니다 ( ‘3 단계 : 달걀 제공’).
TextView t;
private String sText;
private Handler mHandler = new Handler();
private Runnable mWaitRunnable = new Runnable() {
public void run() {
t.setText(sText);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMonster = BitmapFactory.decodeResource(getResources(),
R.drawable.monster1);
t=new TextView(this);
t=(TextView)findViewById(R.id.TextView01);
sText = "Step One: unpack egg";
t.setText(sText);
sText = "Step Two: fry egg";
mHandler.postDelayed(mWaitRunnable, 3000);
sText = "Step three: serve egg";
mHandler.postDelayed(mWaitRunnable, 4000);
...
}
답변
🙂 스레드를 잘못된 방식으로 사용하고 있습니다. 다음을 수행하십시오.
private void runthread()
{
splashTread = new Thread() {
@Override
public void run() {
try {
synchronized(this){
//wait 5 sec
wait(_splashTime);
}
} catch(InterruptedException e) {}
finally {
//call the handler to set the text
}
}
};
splashTread.start();
}
그게 다야.
답변
텍스트를 sam textview로 두 번 설정하면 처음 작성된 텍스트를 덮어 씁니다. 따라서 두 번째로 settext를 사용할 때 다음과 같이 새 문자열을 추가합니다.
textview.append("Step Two: fry egg");