アクティビティに参加していて、(スレッドを使用して)ファイルをダウンロードしたいと同時に、メインスレッドがダウンロードが完了するまで待機したい場合はどうすればよいですか?
質問する
841 次
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 に答える