我创建了一些代码行,如果连接设置没有任何异常,这些代码应该切换到下一个 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/