简体   繁体   English

Android-Service类中有关AsyncTask的说明

[英]Android - Explanation about AsyncTask in Service class

I've a task to running service every 3 second, the service will execute asynctask to checking sqlite and sending data into server 我有一个任务,每3秒运行一次服务,该服务将执行asynctask来检查sqlite并将数据发送到服务器

Code of myService.class myService.class代码

/* import foo.foo.foo */

public class myService extends Service {
    public Runnable mRunnable = null;
    private boolean mRunning = false;
    Handler mHandler = new Handler();
    IBinder mBinder = new LocalBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    public class LocalBinder extends Binder {
        public myService getServerInstance() {
            return myService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("Service"," onstart kepanggil ga?");
        mRunnable = new Runnable() {
            @Override
            public void run() {
                Log.d("Service","SERVICE RUN");
                SharedPreferences pref = getSharedPreferences("wit_player_shared_preferences", MODE_PRIVATE);
                String servcheck = pref.getString("serviceChecker", null);
                DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                int countFlagAuditID = db.getCountFlagAuditID();
                int countNeedToSend = db.getCountContact();
                if (countNeedToSend > 0){
                    Log.d("countNeedToSend : ", String.valueOf(countNeedToSend));
                    sending a = new sending();
                    try {
                        if(servcheck.equals("no")){
                            Log.d("Service","SERVICE TRY CALL SENDING");
                            a.execute().get();
                        }
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }
                if (countFlagAuditID > 0){
                    Log.d("countFlagAuditID : ", String.valueOf(countFlagAuditID));
                    if(servcheck.equals("no")){
                        Log.d("Service","SERVICE TRY CALL SENDGET");
                        sendget b = new sendget();
                        b.execute();
                    }
                }
                db.close();
            mHandler.postDelayed(mRunnable, 3 * 1000);
            }
        };
        mHandler.postDelayed(mRunnable, 3 * 1000);
        return START_STICKY;
    }
    //async task
    private class sending extends AsyncTask<Void, Void, String >
    {
      @Override
      protected void onPreExecute() {
        Log.i("SENDING", "start sending");
        SharedPreferences pref = getSharedPreferences("wit_player_shared_preferences", MODE_PRIVATE);
        pref.edit().putString("serviceChecker", "yes").commit();
        if (serv.equals("yes")){
            Log.i("stop service", "service di stop");
            stopSelf();
        }
      }
      @Override
      protected String doInBackground(Void... params) {
      //send data to server
      }
      @Override
      protected void onPostExecute(String result) {
         SharedPreferences pref = getSharedPreferences("wit_player_shared_preferences", MODE_PRIVATE);
         pref.edit().putString("serviceChecker", "no").commit();
      }
    }
    private class sendget extends AsyncTask<Void, Void, String >
    {
      //execute post to server
    }
}

I've a list of question about the code above: 我有一个关于上面的代码的问题列表:

  1. to let my service run every 3sec I need to declare twice of mHandler.postDelayed(mRunnable, 3 * 1000); 为了让我的服务每3秒运行一次,我需要声明两次mHandler.postDelayed(mRunnable, 3 * 1000); , if I'm declare the code just one, the service will run once, why it can be like that? ,如果我只声明一个代码,该服务将运行一次,为什么会这样呢?
  2. on sending asynctask I've add stopSelf() on onPreExecute() that mean the service will stop, but why doInBackground() task keep run? sending asynctask我已经添加stopSelf()onPreExecute()意味着该服务将停止,但为什么doInBackground()的任务保持运行?

Try to use timer instead of handler 尝试使用计时器而不是处理程序

private final Timer mTimer = new Timer();

mTimer.scheduleAtFixedRate(new LocationUpdateTask(), 0, 3000);

private class LocationUpdateTask extends TimerTask {
    @Override
    public void run() {

        try {
            //Do your stuff
        } catch (Exception e) {
            // TODO: handle exception

        } catch (ExceptionInInitializerError in) {

        }


    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM