googlearchive / firebase-jobdispatcher-android

DEPRECATED please see the README.md below for details.
Apache License 2.0
1.79k stars 208 forks source link

Job terminate when activity destroyed. #207

Closed jakal23 closed 6 years ago

jakal23 commented 6 years ago

I have created some thread which print a interval each second. When I close application Thread terminate, and I can't handle message.

public class MyJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters job) {
        new Thread(new MyJobService.MyRunnable(1, "started job", getApplicationContext())).start();
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters job) {
        return false; 
    }

    class MyRunnable implements Runnable {

        private final int mStartId;
        private final String mName;
        private final Context mContext;
        private final Handler mHandler;

        MyRunnable(int startId, String name, Context context) {
            mStartId = startId;
            mName = name;
            mContext = context;
            mHandler = new Handler(Looper.getMainLooper()){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);

                    Toast.makeText(mContext, "Pased time is " + msg.what, Toast.LENGTH_SHORT).show();
                }
            };
        }

        @Override
        public void run() {

            int index = 0;

            while (true){

                print("Service/" + mName + " " + mStartId + " looped -> " + index + " Context " + mContext);

                index++;

                try {
                    Thread.sleep(mStartId * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (index == 10 || index == 15){
                    Message message = mHandler.obtainMessage(index);
                    mHandler.sendMessage(message);
                }
                if (mStartId == 2 && index == 10)
                    stopSelf(mStartId);
            }
        }
    }

    private void print(String text){
        Log.d(getClass().getSimpleName(), text);
    }
}

Activity class

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    public boolean isConnected;
    private ServiceConnection mConnection;
    private FirebaseJobDispatcher mDispatcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.job_start).setOnClickListener(this);
        findViewById(R.id.job_stop).setOnClickListener(this);

        mDispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(getApplicationContext()));
    }

@Override
    public void onClick(View v) {
        String TagJob = "my-unique-tag";
        int id = v.getId();

        switch (id){
            case R.id.job_start:
                Job myJob = mDispatcher.newJobBuilder()
                        // the JobService that will be called
                        .setService(MyJobService.class)
                        // uniquely identifies the job
                        .setTag(TagJob)
                        // one-off job
                        .setRecurring(false)
                        // don't persist past a device reboot
                        .setLifetime(Lifetime.FOREVER)
                        // start between  and 15 seconds from now
                        .setTrigger(Trigger.executionWindow(1, 15))
                        // don't overwrite an existing job with the same tag
                        .setReplaceCurrent(false)
                        // retry with exponential backoff
                        .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                        // constraints that need to be satisfied for the job to run
                        .setConstraints(Constraint.ON_ANY_NETWORK)
                        .build();

                mDispatcher.mustSchedule(myJob);
                break;
            case R.id.job_stop:
                mDispatcher.cancel(TagJob);
                break;
        }
    }

Apart of this dispatcher can not cancel a job. mDispatcher.cancel(TagJob);

jakal23 commented 6 years ago

is alredy opened