Флаг из класса AsyncTask не работает должным образом в основном классе - PullRequest
0 голосов
/ 18 апреля 2020

Я создал несколько строк кода, которые должны переключаться на следующее действие, если соединение установлено без каких-либо исключений. Но если есть некоторые исключения, он должен сделать «Ошибка!» тост, а не go до следующего занятия. Логический флаг в классе Connection работает хорошо: если сервер выключен, приложение скажет «Ошибка!», Если включено, не будет. Но тот же флаг в основном классе (con.flag) не работает должным образом, похоже, он всегда false . Приложение всегда переключается на следующее действие, с тостом или без, в зависимости от состояния сервера. Что не так в моем коде? Я предполагаю, что есть кое-что, чего я не знаю об инициализации полей классов AsyncTask. Итак, вот мой код:

public class Connection extends AsyncTask<Void, Void, String> {
    Context mContext;
    public Connection(Context context){
        this.mContext = context;
    }
    static String value;
    boolean flag = false;

    @Override
    protected String doInBackground(Void... arg0) {

        try {
            Jedis jedis = new Jedis("192.168.0.120", 6381);
            String name = jedis.ping();
            value = name;
        } catch (Exception e){
            flag = true;
        }
        return null;
    }
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (flag) {
            Toast toast = Toast.makeText(mContext,
                    "Error!", Toast.LENGTH_LONG);
            toast.show();
        }
    }

}
public class MainActivity extends AppCompatActivity {
    Button click;
    Context maincontext = this;
    public void goTo2ndActivity(){
        Intent intent = new Intent(this, Main2Activity.class);
        startActivity(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        click = (Button)findViewById(R.id.button);
        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    final Connection con = new Connection(maincontext);
                    con.execute();
                    if (!con.flag){
                        goTo2ndActivity();
                    }
            }
        });
    }
}

1 Ответ

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

Похоже, ваша проблема в состоянии состязания между основным потоком и асинхронной задачей, проблема в слушателе onClick:

    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


                final Connection con = new Connection(maincontext);
                con.execute();
                if (!con.flag){
                    goTo2ndActivity();
                }
        }
    });

, поэтому эту часть

                if (!con.flag){
                    goTo2ndActivity();
                }

необходимо вызвать начиная с поста, выполните асинхронное задание c, для этого передайте действие конструктору асинхронного задания c следующим образом:

обновите конструктор задания asyn c:

public class Connection extends AsyncTask<Void, Void, String> {
    Context mContext;
    MainActivity activity;
    public Connection(Context context,MainActivity activity){
        this.mContext = context;
        this.activity= activity
    }

..........
..........

и после публикации выполните:

protected void onPostExecute(String result) {
    super.onPostExecute(result);
    if (flag) {
        Toast toast = Toast.makeText(mContext,
                "Error!", Toast.LENGTH_LONG);
        toast.show();
    }else{
     //go to next activity
     activity.goTo2ndActivity();
     }
}

теперь ваш щелчок кнопки становится:

    click.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                //just execute
                final Connection con = new Connection(maincontext,this);
                con.execute();

        }
    });
...