2012-01-06 2 views
1

작업에서 스레드 처리를 어떻게 기다릴 수 있습니까? 내 스레드가 원격 서버에서 .png 그림을 다운로드합니다. 사진 다운로드를 기다리고 싶습니다. 그러면 작업이 처리 중에 계속됩니다.스레드에 대한 android 대기 작업

활동

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.initializer); 

    ImageView mainImageView = (ImageView) findViewById(R.id.imageView); 
    ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar); 

    InitProgress initProgress = new InitProgress(progressBar); // initialization progress bar 
    MyMap map = new MyMap(); // there is written the picture as Drawable from thread 

    MapDownloader mapDownloader = new MapDownloader(map,initProgress); // thread that download picture from server 

    // wait ??? 

    mainImageView.setBackgroundDrawable(buildingMap.getDrawableMap()); // using downloaded picture 
    } 

이 코드는 사진을 나중에 다운로드 다운로드 사진없이 계속됩니다. 세마포어는 이러한 목적에 적합합니까?

답변

0

LoadingBar 대화 상자와 쌍을 이루는 AsyncTask을 사용하십시오. 그러면 PNG가 다운로드 될 때 진행 상황이 표시됩니다.

그런 다음 다운로드가 완료되면 AsyncTask에서 onPostExecute() 메소드를 사용하여 활동에 수행 할 작업을 계속하십시오.

0

이 목적으로 AsyncTask를 사용해야합니다.

여기에 예를 들어

public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> { 

ImageView imageView = null; 

@Override 
protected Bitmap doInBackground(ImageView... imageViews) { 
this.imageView = imageViews[0]; 
return download_Image((String)imageView.getTag()); 
} 

@Override 
protected void onPostExecute(Bitmap result) { 
imageView.setImageBitmap(result); 
} 


private Bitmap download_Image(String url) { 
... 

}

+0

원격 서버에서 사진을 다운로드 할 때 AsyncTask가있는 다른 스레드를 사용할 필요가 없습니까? – misco

+0

AsyncTask는 별도의 스레드에서 실행됩니다. –

+0

벌금, 클래스에서 Activity에서 AsyncTask를 확장하여 호출하면 내 활동이 onPostExecute를 기다릴 것입니까? – misco

1

당신은 AsyncTask를 구속하지 않으려는 경우 브로드 캐스트 리시버를 사용을합니다. 주요 클래스의 BroadcastReceiver를 Activity의 OnResume() 메소드에 등록하여 수신 대기합니다. 서비스 또는 백그라운드 활동이 완료되면 BroadcastReceiver를 트리거하여 백그라운드 서비스가 수행 된 활동을 알립니다.

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent service = new Intent(context, WordService.class); 
     context.startService(service); 
     }