時間のかかる作業 (15 ~ 70 秒) を実行するバックグラウンド スレッド ( ) のApplication
クラスで開始します。onCreate
AsyncTask
Application
onCreate()
アクティビティでは、メソッドで開始されたそのタスクが完了した場合にのみ、いくつかの操作を行う必要があります。
これに対する私の解決策は次のとおりです。
Application
クラス
- 単一のメソッドでインターフェイスを作成する
- メソッドで
AsyncTask
onPostExecute
更新しますlistener
- 進行中か終了し
boolean
たかを poutside から知る変数もありますasyncTask
MyActivity
クラス
- 私は実装します
listener
- ボタンを押すと:
asyncTask
進行中の場合は、 を設定すると、いつ完了したかlistener
が通知され、そこで操作を行いますonCommandEnded
AsyncTask
- asyncTask ジョブが完了したら、ここで次の操作を行います。
これが正しい方法かどうかはわかりません...
import android.app.Application;
import android.content.Context;
import android.os.AsyncTask;
public class MyApplicationClass extends Application {
protected static MyApplicationClass instance;
public static MyApplicationClass getInstance() {
return instance;
}
private ApplicationListener listener;
public void setListener(ApplicationListener listener) {
this.listener = listener;
}
public static interface ApplicationListener {
void onCommandEnded();
}
private boolean isInProgress;
@Override
public void onCreate() {
super.onCreate();
instance = this;
CommandAsyncTask copyFfmpeg = new CommandAsyncTask();
copyFfmpeg.execute();
}
private class CommandAsyncTask extends AsyncTask<Void, Void, Double> {
@Override
protected void onPreExecute() {
super.onPreExecute();
isInProgress = true;
}
@Override
protected Double doInBackground(Void... params) {
//do some time consuming operations here
return null;
}
@Override
protected void onPostExecute(Double aDouble) {
if (listener != null) {
listener.onCommandEnded();
}
isInProgress = false;
super.onPostExecute(aDouble);
}
}
public boolean isInProgress() {
return isInProgress;
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MyActivity extends Activity implements MyApplicationClass.ApplicationListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MyApplicationClass.getInstance().isInProgress()) {
MyApplicationClass.getInstance().setListener(MyActivity.this);
} else {
//start new asynctask
}
}
});
}
@Override
public void onCommandEnded() {
//start here new asynctask
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, MyActivity"
/>
</LinearLayout>