Назначение контекста для обратного вызова - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть класс Asynctask с интерфейсом, который перезванивает другому классу, когда это будет сделано.Проблема в том, что, как только я вызвал asynctask, он повторяется каждые 5 секунд, основываясь на коде, установленном на onpostexecute, независимо от текущей активности.Проблема в том, что мне нужен доступ к интерфейсу на моей ТЕКУЩЕЙ ДЕЯТЕЛЬНОСТИ, а не к тому, который инициировал Asynctask.

Я пытаюсь создать контекстный контекст переменной и обновить его, чтобы он стал контекстом текущего действия (каждое действие имеет MainActivity.contexto = this; в своем методе onCreate. Я хотел изменить обратный вызов в onpostexecute, чтобы он былтекущая активность, а не та, которая начала все, так что я могу получить доступ к выходу из интерфейса в этой активности.

Это то, что я пока имею в своей основной деятельности:

public class MainActivity extends AppCompatActivity implements ClimateAPI.OnDownloadComplete, DownloadArduino.OnArduinoDownloadComplete,LuzPopup.ExampleDialogListener {

    public static Context contexto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_main);
        DownloadArduino downloadArduino = new DownloadArduino(MainActivity.this);
        downloadArduino.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    @Override
    public void onArduinoDownloadComplete(String temp, String humi, String lum, String light) {
        Log.d(TAG, "onArduinoDownloadComplete: entrou ");
        TextView textTempArd = (TextView) findViewById(R.id.textTempArd);
        textTempArd.setText(temp+"°C" );
        TextView textUmidArd = (TextView) findViewById(R.id.textUmidArd);
        textUmidArd.setText(humi+ "%");
        TextView textLumArd = (TextView) findViewById(R.id.textLumArd);
        textLumArd.setText(lum);

        if((DownloadArduino.lightstate==1) && (DownloadArduino.luminosity<300) && (contexto==this)) {
            LuzPopup luzPopup = new LuzPopup();
            luzPopup.show(getSupportFragmentManager(), "example dialog");
        }    
    }

И это то, что у меня есть в моей AsyncTask:

public class DownloadArduino extends AsyncTask<String,Void,Void> {

    private static final String TAG = "DownloadArduino";
    public int internetAccess = 0; /*Variavel que checa acessibilidade da internet ( 0 = inacessivel, 1 = acessivel )*/
    public static String umidade;
    public static String temperatura;
    public static String luminosidade;
    public static int lightstate;
    public static int luminosity;
    public static String light;
    public String result;
    private final OnArduinoDownloadComplete mCallBack;

    interface OnArduinoDownloadComplete{
            void onArduinoDownloadComplete(String temp, String humi, String lum, String light);
        }

    public DownloadArduino(OnArduinoDownloadComplete callBack) {
        Log.d(TAG, "DownloadArduino: callback e" + callBack);
        mCallBack = callBack;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        Log.d(TAG, "onPostExecute: contexto e " + MainActivity.contexto);
        if (internetAccess == 0 ){ /*Output para o caso de nao haver conexao desde o comeco do metodo*/
            Toast.makeText(MainActivity.contexto, "Verifique a conexão", Toast.LENGTH_LONG).show(); /*Nao ha conexao*/
        }
        mCallBack.onArduinoDownloadComplete(temperatura,umidade,luminosidade,light);
        if (MainActivity.logado) {
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    DownloadArduino downloadArduino = new DownloadArduino((OnArduinoDownloadComplete) MainActivity.contexto);
                downloadArduino.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                }
        }, 5000);
    }
}

Проблема в том, что я не могу применить CONTEXT к callBack, есть ли способ сделать это, так что действие, которое вызывается обратновсегда ТЕКУЩАЯ ДЕЯТЕЛЬНОСТЬ (не та, которая называла асинктаск)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...