来自 AsyncTask 类的标志在主类中无法正常工作



我已经创建了一些代码行,如果没有任何异常地设置了连接,这些代码行应该切换到下一个活动。但是,如果有一些例外,它应该发出"错误!"祝酒词,而不是进入下一个活动。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();
}
}
});
}
}

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

相关内容

  • 没有找到相关文章

最新更新