2

時間のかかる作業 (15 ~ 70 秒) を実行するバックグラウンド スレッド ( ) のApplicationクラスで開始します。onCreateAsyncTask

Application onCreate()アクティビティでは、メソッドで開始されたそのタスクが完了した場合にのみ、いくつかの操作を行う必要があります。

これに対する私の解決策は次のとおりです。

Applicationクラス

  • 単一のメソッドでインターフェイスを作成する
  • メソッドでAsyncTask onPostExecute更新しますlistener
  • 進行中か終了しbooleanたかを poutside から知る変数もありますasyncTask

MyActivityクラス

  • 私は実装しますlistener
  • ボタンを押すと:
    • asyncTask進行中の場合は、 を設定すると、いつ完了したかlistenerが通知され、そこで操作を行いますonCommandEndedAsyncTask
    • 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>
4

0 に答える 0