Код AsyncTask добавлен в сервис в Android - PullRequest
0 голосов
/ 18 апреля 2020

Я очень новичок в Android, я создаю android приложение, связь с Siemens PL C работает нормально, но если я нажимаю кнопку только данные, показанные в android, я хочу запустить этот код в сервисе я не знаю, как добавить код (ниже) в сервис

protected String doInBackground(String... strings) {
            try{

                client.SetConnectionType(S7.S7_BASIC);
                int res = client.ConnectTo("10.0.2.2",0,1);
                if(res == 0)
                {
                    byte[] data = new byte[4];
                    res = client.ReadArea(S7.S7AreaDB,1,0,2,data);
                    ret = "Values  "+S7.GetWordAt(data,0);
                }
                else {
                    ret = "Err:"+S7Client.ErrorText(res);
                }
                client.Disconnect();
            }
            catch (Exception e)
            {
                ret= "Exe"+e.toString();
                Thread.interrupted();
            }
            return "Executed";
        }

Выше код работает нормально, но этот код добавлен в сервис, я создаю один сервис

public class MyService extends Service {
S7Client client = new S7Client();
String ret = "";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    PlcReader task=new PlcReader();
    task.execute("");
    return START_NOT_STICKY;
}

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


public class PlcReader extends android.os.AsyncTask<String,Void,String>{
    @Override
    protected String doInBackground(String... strings) {

        try{

            client.SetConnectionType(S7.S7_BASIC);
            int res = client.ConnectTo("10.0.2.2",0,1);
            if(res == 0)
            {
                byte[] data = new byte[4];
                client.ReadArea(S7.S7AreaDB,1,0,4,data);
                ret = "Values  "+S7.GetWordAt(data,0);
            }
            else {
                ret = "Err:"+S7Client.ErrorText(res);
            }
            client.Disconnect();
        }
        catch (Exception e)
        {
            ret= "Exe"+e.toString();
            Thread.interrupted();
        }
        return "Executed";
    }

    @Override
    protected void onPostExecute(String s) {
        Toast.makeText(getApplicationContext(),ret,Toast.LENGTH_LONG).show();
    }
}

I добавлен код со службой, но показана проблема с подключением

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вы можете позвонить своему AsyncTask из метода onStartCommand в Service:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Let it continue running until it is stopped.
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        new MyAsyncTask().execute("stringParameter")

        return START_STICKY;
    }

Пара советов:

Я вижу, что вы возвращаете строковое значение из вашего AsyncTask, просто избегайте использования

String result = new MyAsyncTask().execute("stringParameter").get()

, поскольку это заблокирует ваш основной поток (если вы не запустите задачу asyn c в другом потоке). Более подходящее решение - обработать результат в методе onPostExecute в вашем AsyncTask (просто переопределить его)

Еще одна вещь, о которой стоит подумать, это то, что AsyncTask устарела в Android R, некоторые хорошими альтернативами являются java.util.concurrent пакет и RxJava библиотека

0 голосов
/ 18 апреля 2020

См. Этот пример: -

public class ExtractService extends Service {


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

                AsyncTask task=new AsyncTask();
                task.execute();

    return START_NOT_STICKY;
}

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


public class AsyncTask extends android.os.AsyncTask<Void,Void,Void>{
    @Override
    protected Void doInBackground(Void... voids) {

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

    }
  }
}
...