0

アクティビティに参加していて、(スレッドを使用して)ファイルをダウンロードしたいと同時に、メインスレッドがダウンロードが完了するまで待機したい場合はどうすればよいですか?

4

3 に答える 3

2

アクティビティからAsyncTask ..を使用します

new DownloadTask(this).execute();

たとえば、タスク:

public class DownloadTask extends AsyncTask<Void, Void, String>  {

private ProgressDialog progressDialog;  
private Context context;

/**
 * 
 * @param context
 * @param pdfDoc the document of the PDF
 */
public DownloadTask(Context context) {
    this.context = context;

    progressDialog = new ProgressDialog(context);
}

@Override
protected void onPreExecute() {  
        progressDialog.setMessage("Downloading...");
        progressDialog.setIndeterminate(true);
        progressDialog.show();
}

@Override
protected String doInBackground(Void... arg0) {
    //download here
}

@Override
protected void onPostExecute(final String result) {
        progressDialog.dismiss();

}
}
于 2012-11-08T14:08:30.810 に答える
1

AsyncTaskとコールバックを使用します。

public interface DownloadCallback<T>{
    public void onFinishDownload(T downloadedResult);
}


public static void downloadString(String url, DownloadCallback<String> callback){
    new AsyncTask<Void,Void,Void>(){

        String result;            

        @Override
        protected void onPreExecute() {  
            // Do things before downloading on UI Thread
        }

        @Override
        protected String doInBackground(Void... arg0) {

             //download here
             result = download(url);

        }

        @Override
        protected void onPostExecute(final Void result) {
            // Do things on UI thread after downloading, then execute your callback
            if (callback != null) callback.onFinishDownloading(result);
        }


    }.execute();
}

そしてこれを使用するには、これを行うだけです:

downloadString("http://www.route.to.your.string.com", new DownloadCallback<String>(){
    public void onFinishDownloading(String downloadedResult){
         Toast.makeText(YourActivityName.this, downloadedResult, Toast.LENGTH_SHORT).show();
    }
});
于 2012-11-08T14:19:56.047 に答える
0

スレッドがメインスレッドと通信して、ダウンロードが終了したことを通知する場合は、ハンドラーを使用します。 このコードは、スレッドを理解するのに役立ちます。

MyHnadler handler;
onCreate(Bundle savedInstance)
{
 setContent..
...
 handler=new MyHandler();
 new MyThread().start();
}
public class MyHandler extends Handler
{
  @Override
  public void handleMessage(Message message) {
            switch (message.what) {
            case 1:   //....threading over
                         //write your code here
                   break;
            case2 : //if you want to be notiifed of something else
                   ..
 }

public class MyThread extends Thread
{
 @Override
 public void run()
 {
   //run the threa
   //and when over
   Message msg=handler.getMessage();
   msg.what=1;
   handler.sendMessage(msg);   //send the message to handler
 }
}
} 


ご覧のとおり、スレッドはハンドラーを介してUIスレッドと通信します。上記の例では、スレッドからUIスレッドにオブジェクトを送信しただけです。これを行うには、スレッドで実行します。任意のオブジェクトにすることができます。これがお役に立てば幸いです:)msg.obj=your_obj

于 2012-11-08T14:31:40.467 に答える