Home > Back-end >  Confused Thread in Android, How to make thread work exactly
Confused Thread in Android, How to make thread work exactly

Time:12-12

I need to implement some works after X seconds and I don't want make it related with UI thread. So I create Thread as below. Specifically, I wanna my doWork1() working every 10s. And imgUpload() do not disurb my thread

private int cntUpdate; //count time to update work1
private int cntUpload; //count time to upload to server
private int cntlosing; //count time losing gps
private void creatThread(){
    Thread myThread = new Thread(){
        @Override
        public void run(){
            try{
                while (!isInterrupted()){
                    Thread.sleep(1000);//1s
                    cntUpdate   ;
                    if(cntUpdate >= 10){ //10s
                        doWork1(); //AsyncTask
                        cntUpdate = 0;
                    }
                    
                    cntUpload   ;
                    if(cntUpload > 100){//100s
                        imgUpload(); //AsyncTask
                        cntUpload = 0;
                    }
                    if(isGpsLosing()){ //checking every sec
                        cntlosing   ;
                        if(cntlosing > 500){
                            doSomething();
                            cntlosing = 0;
                        }
                    }
                            
                }
            }catch (InterruptedException e) {
                Log.d(TAG, "Interruped : "   e);
            }
        }
    };
    myThread.start();
}

When start doWork1() worked every 10s. But when imgUpload() work then doWork1() stopped. But time count still exactly. After imgUpload() finished then doWork1() sending consecutive in 1-2s. Normal: doWork1() - 10s - doWork1() - 10s - dowork1()...10s... When imgUpload doWork1() - 10s - doWork1() - 10s - imgUpload() - time to waiting upload finish (example 30s) - after 30s - doWord1() - 1s - doWork1() -1s -doWork1() - 10s - doWork1() - 10s... come back to normal work

private void doWork1(){
    AsyncWork1 asyncWork1 = new AsyncWork1();
    asyncWork1.execute();
}

public class AsyncWork1 extends AsyncTask<Void, Void, Void>{
    @Override
        protected Void doInBackground(Void... voids) {
            databaseWork(); // get data from table, some calculates...
            return null;
        }
}

private void imgUpload(){
    UpLoadImg upload = new UpLoadImg();
    upload.execute();
}

public class UpLoadImg extends AsyncTask<Void, Void, Void>{
    @Override
        protected Void doInBackground(Void... voids) {
            sendImgtoServer(); // 
            return null;
        }
}

I try use timer for doWork1() but nothing change in my result

private void useTimerWork1(){
    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run(){
            doWork1
        }
    }, 0, 10*1000); //every 10s
}

I am googling and read some topics about thread in SO but all make me confused. I don't know where i missed. I am change from C embed to android. So it is make me stupid and unintelligible Edit me if my explain too complicated

CodePudding user response:

As you do not seem interested in the background (image sending) result, you could just fire up the task in a new Thread and all the uploading will not block and run in parallel if needed, w/o adding delay.

If it works, perhaps you should consider to improve from here..

private void imgUpload(){
    new Thread(()-> sendImgtoServer()).start();
}
private void doWork1(){
    new Thread(()-> databaseWork()).start();
}

  • Related