Как использовать AsyncTask в нескольких классах?это дает исключение нулевого указателя - PullRequest
0 голосов
/ 06 июля 2011

m Очень новый на Android, и это мой первый запрос на Stackoverflow. здесь я получаю исключение нулевого указателя при использовании AsyncTask. Я использую ProgressDialog, для этого я создал (отдельный (новый)) класс, который расширяет AsynchTask. когда я передаю аргумент классу из моего основного класса, из которого я хочу показать ProgressDialog, он дает мне исключение нулевого указателя .. может кто-нибудь сказать мне, что делать .. вот код

class Loader extends AsyncTask<Object, Object, Object> {
    ProgressDialog dialog;

    public void setDialog(ProgressDialog dialog){
        this.dialog = dialog;
    //here i get the reference of dialog from the caller class

}

Спасибо заранее .. Mahaveer

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Нет необходимости отправлять диалог в качестве параметра на AsyncTask, возможно, это вызывает вашу ошибку. Вы можете создать новый ProgressDialog внутри вашего AsyncTask и показать его в методе onPreExecute, так как этот метод работает в потоке пользовательского интерфейса. Надеюсь, это поможет.

P.S. Старайтесь всегда публиковать logcat вашей ошибки, если она у вас есть, людям будет легче помочь. И поздравляю с первым постом!

0 голосов
/ 06 июля 2011
private class LocationControl extends AsyncTask<Context, Void, Void>
{
    private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
    protected void onPreExecute()
    {
        this.dialog.setMessage("Tap outside dialog to close");
        this.dialog.setTitle("Searching your current location...");
        //this.dialog.setTitle(R.string.hello);
        this.dialog.setCanceledOnTouchOutside(true);
        this.dialog.show();
    }

    protected Void doInBackground(Context... params)
    {
        //Wait 40 seconds to see if we can get a location from either network or GPS, otherwise stop
        Long t = Calendar.getInstance().getTimeInMillis();
        while (!hasLocation && Calendar.getInstance().getTimeInMillis() - t < 40000) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        return null;
    }

    protected void onPostExecute(final Void unused)
    {
        if(this.dialog.isShowing())
        {
            this.dialog.dismiss();
        }

        if (currentLocation != null)
        {
            GeoPoint startPoint = new GeoPoint((int)(currentLocation.getLatitude()*1E6),(int)(currentLocation.getLongitude()*1E6));
            final MapController mc = mapView.getController();
            mc.animateTo(startPoint);
            mc.setZoom(16);
        }
        else
        {
            /*
            Toast.makeText(MainActivity.this, "Location could not be found\nusing default location", Toast.LENGTH_SHORT).show();
            GeoPoint startPoint = new GeoPoint((int)(43.332628*1E6),(int)(5.353128*1E6));           
            final MapController mc = mapView.getController();
            mc.animateTo(startPoint);
            mc.setZoom(16);
            */
        }
    }
}

И позвоните в исполнитель с вашего onCreate():

locationControlTask = new LocationControl();
locationControlTask.execute(this);
0 голосов
/ 06 июля 2011

Использовать переопределенный метод onPreExecute вместо setDialog

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