【问题标题】:Flag from AsyncTask class doesn't work properly in main classAsyncTask 类的标志在主类中无法正常工作
【发布时间】:2020-08-01 03:21:13
【问题描述】:

我已经创建了一些代码行,如果连接设置没有任何异常,它们应该切换到下一个活动。但如果有一些例外,它应该会“错误!”干杯,而不是去下一个活动。 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();
                    }
            }
        });
    }
}

【问题讨论】:

    标签: java android android-asynctask initialization visibility


    【解决方案1】:

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

    必须在您的异步任务执行后调用,因为这样会将活动传递给异步任务的构造函数,如下所示:

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

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

    【讨论】:

    • 谢谢!它有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2013-11-20
    相关资源
    最近更新 更多