我有一个AsyncTask从服务器中恢复数据。我需要的是显示在对话框中恢复的数据。如何调用该函数从AsyncTask中创建对话框?如果我不能那样做,那我有什么选择?是否可以知道AsyncTask是否已经完成?
这是我的代码:
//Function calling the AsyncTask
public void getData(int pos)
{
new DBTask().execute();
//Is it possible to know here if the AsyncTask has ended or not??
}
private class DBTask extends AsyncTask<Long, Boolean, Integer>{
ProgressDialog ServerPD = new ProgressDialog(MRRankingActivity.this);
@Override
protected void onPreExecute()
{
ServerPD = ProgressDialog.show (MRRankingActivity.this, "", "Connecting to server...", true, false);
}//End of onPreExecute
@Override
protected Integer doInBackground(Long... params)
{
publishProgress(isOnline());
if(isOnline())
{
getDBData();
if(isOK)
{
//I want to show the result by calling this function..
showResult();
//Calling this function will trow error..So how can i show my result??
Log.d("LIST","DONE..Reached Final Destination");
}
}
}
return null;
}
@Override
protected void onProgressUpdate(Boolean... isConnection) {
// TODO Auto-generated method stub
super.onProgressUpdate(isConnection);
if(isOnline())
{
ServerPD.setMessage("Retreving Data");
}
}
@Override
protected void onPostExecute(Integer result) {
if (ServerPD.isShowing())
{
ServerPD.dismiss();
}
}//End of onPostExecute
}//End of DBTask
public void getDBData()
{
try{
//Code foe connecting to database and retreive data.
//If everything is ok then isOK is set to True..
//else its set to false
isOK=true;
}
catch(Exception e)
{
isOK=false;
}//End if catch
}
public void showResult()
{
//I want to show result here in a new Dialog ...
}
//Checking is connection available
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
如何在这种情况下显示结果?有没有找到AsyncTask结束的方法?
答案 0 :(得分:1)
而不是给予
private class DBTask extends AsyncTask<Long, Boolean, Integer>{
给
private class DBTask extends AsyncTask<Long, Boolean, Boolean>{
然后在doInBackground()里面创建一个变量:
boolean success = false;
在你的内部ifOnline()make:
success = true;
在该方法的最后给出:
return success;
在onPostExecute()内部,参数为boolean而不是Integer。
给:
if(result) {
showResult();
}
希望这可以帮到你。 onPostExecute()仅在doInBackground()之后调用。
答案 1 :(得分:1)
达到目的的最佳方法是创建Handler
并在其中显示对话框。像这样的事情
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
AlertDialog.Builder alertbox = new AlertDialog.Builder(
CardDetails.this);
alertbox.setMessage("Please Login First ...");
alertbox.setPositiveButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0,
int arg1) {
}
});
alertbox.show();
}
}
并从您的异步任务
执行此操作 new RefreshHandler().sendEmptyMessage(0)
答案 2 :(得分:1)
简化Mathew建议的内容..只需像这样修改你的代码 首先通过初始化int varable isSuccess然后在isOK if语句中将isSucces的值更改为1来修改doInBackgroud。现在返回isSuccess.like this
@Override
protected Integer doInBackground(Long... params)
{
int isSuccess=0;
publishProgress(isOnline());
if(isOnline())
{
getDBData();
if(isOK)
{
isSuccess=1;
}
}
}
return isSuccess;
}
现在修改你的PostExecute()以处理在onPostExecute中导致的isSuccess值。
@Override
protected void onPostExecute(Integer result) {
if (ServerPD.isShowing())
{
ServerPD.dismiss();
}
if(result==1)
{
showResult();
}
}//End of onPostExecute
希望这有帮助。
答案 3 :(得分:0)
Shijilal ...当doInBackground方法结束时,您将在onPostExecute中得到通知。 doInBackground中的返回值被发送到onPostExecute。您不应该在doInBackground中触摸UI,该UI在与UI线程分开的线程中运行。
我打算在调用asynchTask.execute之前调用isOnline。我认为doInBackground中的方法会返回Result类型,然后将其发送到onPostExecute。因此,请考虑:AsynchTask<SQLQuery,Void,ResultSet>
或其他任何合适的内容。