java - AsyncTask 类中的标志在主类中无法正常工作

标签 java android android-asynctask initialization visibility

我创建了一些代码行,如果连接设置没有任何异常,这些代码应该切换到下一个 Activity 。但如果有一些异常(exception),它应该会出现“Error!” toast 而不去参加下一个 Activity 。 Connection 类中的 boolean 标志效果很好:如果服务器关闭,应用程序会说“错误!”,如果打开,则不会。但是主类中的相同标志 (con.flag) 无法正常工作,看起来总是false。应用程序始终切换到下一个 Activity ,是否制作 toast ,具体取决于服务器状态。我的代码有什么问题吗?我想我对 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();
                    }
            }
        });
    }
}

最佳答案

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

必须在异步任务执行后调用,因为它将 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
    }

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

并在执行后:

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

        }
    });

关于java - AsyncTask 类中的标志在主类中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61291699/

相关文章:

java - OSGi ( Felix ) 额外的 system.bundle 导出

java - 保持最后一个对象处于 Activity 状态并按日期停用较旧的对象

java - Volley请求返回数据两次

java - 我想在 android 应用程序中实现 AsyncTask 并行执行器

android - AsyncTask和运行时配置使用简洁的代码示例更改: what approaches,,Android团队认可吗?

java - 无法将单个 XML 文件添加到 Tomcat 的类路径

java - finally block 中的堆栈溢出错误处理

android - Sprint Lg Optimus 驱动程序

android - `SkuType.INAPP`中的 'SkuType.SUBS`和 `In app purchase`有什么区别

android - 在 AsyncTask 中获取上下文