来自 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();
}
});
我已经创建了一些代码行,如果连接设置无一例外,这些代码行应该切换到下一个 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();
}
});