Android AsyncTask во внешнем классе - PullRequest
4 голосов
/ 04 марта 2010

Я работал над приложением, и мне удалось заставить AsyncTask нормально работать, когда он находится во внутреннем классе.

Теперь я выполняю рефакторинг кода, чтобы AsyncTask находился в отдельном классе, но мне интересно, как мне убить ProgressDialog и начать новую операцию после успешного завершения задачи? Я попытался запустить новое действие в методе onPostExecute(..), но я знаю, что это не сработает.


Передача активности потока моего пользовательского интерфейса в качестве аргумента в конструкторе AsyncTask, похоже, не работает:

//In UI Thread I had
public class Test101 extends Activity {
    private Button btnLogin;
    private LoginTask mLoginTask;
    private Context context=this;
    private Test101 mTest101;

    mLoginTask=new LoginTask(context,mTest101);
    mLoginTask.execute(null);

    // In the AsyncTask I had
    Activity mParentActivity;

    public LoginTask(Context context,Activity act){
        this.ctx=context;
        this.mParentActivity=act;
    }

    onPostExecute(..){
        mParentActivity.callSomeMethod();
    }

    ...
}

Я продолжал получать NullPointerException, может быть, я что-то упустил, но это не сработало для меня.

Ответы [ 6 ]

7 голосов
/ 28 января 2011

Вместо того, чтобы передавать 2 параметра, передайте только один такой:

public class Test101 extends Activity {
    private Button btnLogin;
    private LoginTask mLoginTask;

    mLoginTask=new LoginTask(this);
    mLoginTask.execute(); 
    //Instead of sending null put the 1st parameter of the AsyncTask as Void

Код AsyncTask:

  Activity mParentActivity;

public LoginTask(Activity act){
    this = act;
}

onPostExecute(..){
    ((Test101)mParentActivity).callSomeMethod();
}
6 голосов
/ 08 марта 2010

Все, что нужно для начала нового действия, - это объект контекста, который вы передаете в конструктор AsyncTask:

private Context ctx;
private ProgressDialog pDialog;
private String r="";

public LoginTask(Context context){
    super();
    this.ctx=context;
}

@Override
protected void onPostExecute(String result) {
    Log.i("LOGGER", "Done...");
    pDialog.dismiss();
    Intent i=new Intent(ctx,SillyActivity.class);
    ctx.startActivity(i);
}

Если вы передадите действие в конструкторе в AsyncTask и попытаетесь вызвать startActivity(Intent intent), вы всегда получите исключение нулевого указателя.

1 голос
/ 24 сентября 2014
step 1 : create your master class and declare 

mNetworkMaster.runForgetAsync();

step 2: write another class for AsyncTask

package com.example.xxx;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.os.AsyncTask;

public class NetworkMaster {

    Activity mMasterActivity;
    LoadingDialog objLoadingDialog;
    Map<String, String> serverUrls = new HashMap<String,String>();


    // create a constructor
    public NetworkMaster(Activity mMasterActivity){

        this.mMasterActivity = mMasterActivity;     

    }// end constr NetworkMaster


    // Method to run the Async task
    public void runForgetAsync(){

        new ForgetPasswordAsync().execute();

    }// end runForgetAsync


    // dynamically call the thread
    public class ForgetPasswordAsync extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute(){ 
            super.onPreExecute();

        }

        protected String doInBackground(String... urls) {

            serverUrls = Ipsum.getServerUrls();     

            int response = HttpRequest.post().send("name=xxxx").code();

            return ""+response;
        }

        protected void onPostExecute(String result) {

            // return the result to master activity
            ((Login)mMasterActivity).ForgetPassword(result);            

        }

    }// end ForgetPasswordAsync

}// end NetworkMaster
0 голосов
/ 27 апреля 2013

mTest101 не инициирован. Это просто нуль ... Так что вы можете видеть только исключение нулевого указателя, и это обычная вещь. Или вы можете заставить статический метод работать без инициализации класса.

0 голосов
/ 26 ноября 2012

Используйте Android-аннотации для AsyncTask легко, быстро, просто!

0 голосов
/ 07 марта 2010

передайте Activity как параметр конструктора в AsyncTask и оставьте его в поле. фактически это то, что вы получили, будучи внутренним классом (только компилятор написал бы код для вас).

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