초보자이고 Android
이고 Android UI Thread
과 관련된 몇 가지 혼동이 있습니다. 이제는 UI를 만든 스레드와 별개로 스레드를 수정할 수 없다는 것을 알고 있습니다.UI 스레드 이해
좋아요.
약간 혼란스러워하는 첫 번째 Android 앱의 Activity
입니다. 내가 원하는 건 뭐든지 할 수 있지만 onClick
가되지 않도록
1
onCreate
public class NasaDailyImage extends Activity{
public ProgressDialog modalDialog = null;
//------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState){
//Instantiate progress dialog, skipping details.
Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog.show(); // show modal
Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
}
});
}
//------------------------------------------------------------------------------
public synchronized void resetDisplay(boolean parseErrorOccured,
boolean imageErrorOccured,
IotdHandler newFeeds){
if(parseErrorOccured || imageErrorOccured){
// make a Toast
// do not update display
}else{
// make a Toast
// update display
// based on new feed
}
}
//------------------------------------------------------------------------------
class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{
@Override
protected IotdHandler doInBackground(IotdHandler... arg0) {
IotdHandler handler = arg0[0];
handler.processFeed(); // get the RSS feed data !
return handler;
}
//------------------------------------------------------------------------------
@Override
protected void onPostExecute(IotdHandler fromInBackground){
resetDisplay(// call to update the display
fromInBackground.errorOccured,
fromInBackground.imageError,
fromInBackground);
}
//------------------------------------------------------------------------------
}
는 UI 스레드에 있습니다.
왜 그 방법으로 ProgressDialog
과 Toast
을 만들 수 있습니까? 왜 오류가 없습니까?
2.
AsyncTask
은
NasaDailyImage
의 하위 클래스입니다. 즉,
모두
NasaDailyImage
의 방법을 사용하여 디스플레이를 업데이트하는
resetDisplay()
을 액세스 할 수 있습니다.
resetDisplay()
은 UI와는 다른 스레드에서 실행되는
onPostExecute
에서 호출됩니다. 그렇다면 왜 디스플레이를 업데이트 할 수 있습니까?
'onClick'와'UI 스레드에 onPostExecute' 모두 실행됩니다. 당신의 코드에서'doInBackground'는 그 이름에서 알 수 있듯이 백그라운드 스레드에서만 실행됩니다. – Geobits
@Geobits AFAIK, 이것은 이벤트가 ** 다른 스레드 **에서 처리 된 이전 자바와 다릅니다. UI는 하나의 스레드 였고 이벤트 처리는 다른 스레드에서 발생했습니다 –
다음을 통해 읽으십시오. http://stackoverflow.com/a/3653478/752320 – Geobits