来自 AsyncTask class 的标志在 main class 中无法正常工作

Flag from AsyncTask class doesn't work properly in main class

我已经创建了一些代码行,如果连接设置无一例外,这些代码行应该切换到下一个 activity。但如果有一些例外,它应该做"Error!" 敬酒,而不是去下一个activity。 Connection class 中的布尔标志运行良好:如果服务器关闭,应用程序将显示 "Error!",如果打开,则不会。但是 main class (con.flag) 中的相同标志不能正常工作,它看起来总是 false。应用程序总是切换到下一个 activity,是否烤面包,取决于服务器状态。我的代码有什么问题?我想我对 AsyncTask classes 的字段初始化有些不了解。 所以,这是我的代码:

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();
                    }
            }
        });
    }
}

您的问题似乎是主线程和异步任务之间的竞争条件,问题出在 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();
                }

必须从 post 执行你的异步任务时调用,为此将 activity 传递给异步任务的构造函数,如下所示:

更新异步任务的构造函数:

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

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

并在 post 上执行:

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();

        }
    });