我正在尝试等待后台进程完成,然后在完成后相应地做一些事情。
基本上我有一个类TwitterActivity
和一个扩展CheckInternetConnection
的内部类AsyncTask
。我还有一个按钮mSignin
,我为它设置了事件处理。另外我还有一个布尔hasInternet
。
我的目标是按下mSignin
按钮时,我会拨打CheckInternetConnection
。这应该更新我的布尔值hasInternet
。因此,我希望做一些事情。
但我想要在onClick()
方法内完成。
有什么办法可以实现吗?感谢。
public class TwitterActivity extends Activity
{
private boolean hasInternet = false;
private Button mSignin;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin = (Button)findViewById(R.id.login_id);
mSignin.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
new CheckInternetConnection().execute();
if(hasInternet)
//do some stuff
else
//do some other stuff
}
});
}
class CheckInternetConnection extends AsyncTask<Void, Void, Boolean>{
@Override
protected void onPostExecute(Boolean result){
if(result)
hasInternet = true;
else
hasInternet = false;
}
@Override
protected Boolean doInBackground(Void... params) {
return true;
}
}
}
答案 0 :(得分:1)
有很多方法可以等待AsyncTask
完成,但我认为你不想这样做,因为它会阻止UI线程。相反,将该检查移至onPostExecute
。单击按钮时,您也可以检查连接。
public class TwitterActivity extends Activity
{
private boolean hasInternet = false;
private Button mSignin;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin = (Button)findViewById(R.id.login_id);
mSignin.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
checkInternet();
}
});
}
private void checkInternet(){
if(hasInternet)
//do some stuff
else
new CheckInternetConnection().execute();
}
class CheckInternetConnection extends AsyncTask<Void, Void, Boolean>{
@Override
protected void onPostExecute(Boolean result){
if(result)
hasInternet = true;
else
hasInternet = false;
checkInternet();
}
@Override
protected Boolean doInBackground(Void... params) {
return true;
}
}
}
答案 1 :(得分:0)
异步任务的目的是处理一个不会阻止主线程的昂贵过程。如果这是一个快速的步骤,不要把它作为一个单独的任务,只需在那时做到。
答案 2 :(得分:0)
一种方法是:
public class TwitterActivity extends Activity {
private boolean hasInternet = false;
private Button mSignin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin = (Button)findViewById(R.id.login_id);
mSignin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... params) {
// TODO: put your async job here
return true;
}
@Override
protected void onPostExecute(Boolean result){
hasInternet = result;
if( hasInternet ) {
// do some stuff
//
} else {
// do some other stuff
}
}
}.execute();
}
});
}
}