Можно ли вызвать другую функцию изнутри AsyncTask? - PullRequest
1 голос
/ 01 марта 2011

У меня есть 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 закончился?

Ответы [ 4 ]

1 голос
/ 01 марта 2011

Упрощение того, что предложил Мэтью. Просто измените ваш код следующим образом. Сначала измените doInBackgroud, инициализируя int varable isSuccess, а затем изменив значение isSucces на 1 внутри оператора isOK if.Теперь верните isSuccess.like this

 @Override
    protected Integer doInBackground(Long... params) 
    {
        int isSuccess=0;
        publishProgress(isOnline());

            if(isOnline())
            {

            getDBData();
                    if(isOK)
                        {
                        isSuccess=1;
                        }
            }   
        }

        return isSuccess;
    }

Теперь измените ваш PostExecute () для обработки значения isSuccess, возвращенного в результате в onPostExecute

@Override
    protected void onPostExecute(Integer result) {
        if (ServerPD.isShowing())
        {
            ServerPD.dismiss(); 
        }
        if(result==1)
            {
                showResult();
            }

    }//End of onPostExecute

Надеюсь, это поможет.

1 голос
/ 01 марта 2011

Лучший способ реализовать ваше намерение - создать 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)

1 голос
/ 01 марта 2011

Вместо того, чтобы давать

private class DBTask extends AsyncTask<Long, Boolean, Integer>{ 

, дать

private class DBTask extends AsyncTask<Long, Boolean, Boolean>{ 

Затем внутри doInBackground () создайте переменную:

boolean success = false;

Внутриur ifOnline () make:

success = true;

И в конце этого метода задайте:

return success;

Внутри onPostExecute () принимайте параметр как логическое значение вместо Integer.

Даешь:

if(result) {

showResult();

}

Надеюсь, это поможет тебе.onPostExecute () вызывается только после doInBackground ().

0 голосов
/ 01 марта 2011

Shijilal ... Когда метод doInBackground завершается, вы получаете уведомление в onPostExecute. Возвращаемое значение в doInBackground отправляется onPostExecute. Вы не должны касаться пользовательского интерфейса в doInBackground, который выполняется в потоке, отдельном от потока пользовательского интерфейса.

Я бы подумал вызвать isOnline, прежде чем вызывать asynchTask.execute. Я думаю, что метод в doInBackground будет возвращать тип Result, который затем будет отправлен на onPostExecute. Так что подумайте: AsynchTask<SQLQuery,Void,ResultSet> или что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...