我应该将哪个上下文传递给超类?

时间:2015-10-29 17:53:44

标签: java android inheritance

上下文传递给我的班级存在很大问题。我几乎尝试了所有东西:getApplicationContext()/ getBaseContext()/ getContext() - > 不适用于自动完成/此。 目前this几乎正常工作(我的意思是它不是空)。

public class PersonActivity extends Activity implements OnTaskCompletedInterface {

    public PersonAdapter listAdapter ;

    public PersonActivity() {
        try {
            PersonGetAsync asyncGet = new PersonGetAsync(this, this, this);
            asyncGet.execute().get; // supposed to block the UI I know
        // With this, I catch the exception
        }catch (Exception e) {e.printStackTrace();}
    }
public PersonAdapter getListAdapter() {
        return listAdapter;
    }

详情请见以下儿童:

public class PersonBlueActivity extends PersonActivity {

private ListView lv_Person;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_person_chooser_blue);

    lv_Person = (ListView) findViewById(R.id.activity_person_chooser_blue_lv);
    lv_Person.setAdapter(getListAdapter());
    lv_Person.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
    lv_Person.setClickable(true);
}
@Override
    public PersonAdapter getListAdapter() {
        return super.getListAdapter();
    }

这是Async

public class PersonGetAsync extends AsyncTask<String, Void, String> {

    ProgressDialog dialog;
    Activity mActivity;
    Context mContext;
    String response;
    private OnTaskCompletedInterface listener;

    public PersonGetAsync(Activity activity, Context context, OnTaskCompletedInterface listener) {
        this.listener = listener;
        mActivity = activity;
        mContext = context;
    }

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(mContext);
        String str = "Connexion en cours";
        dialog.setTitle(str + "...");
        dialog.setIndeterminate(false);
        dialog.setCancelable(true);
        dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        System.setProperty("http.keepAlive", "false");
        response = "";
        try {
            //Appel du webservice
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(Globale.webURL+Globale.PERSON);

            // Envoi de la requête GET
            HttpResponse httpResponse = httpClient.execute(request);
            response = EntityUtils.toString(httpResponse.getEntity());

            Log.v("Get : ", response);

        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        return response;
    }

    @Override
    protected void onPostExecute(String result) {
        listener.onTaskCompleted(result);
        dialog.dismiss();
    }

但是,由于我的背景没有通过,我无法完成这一步:DebugLog

它让我感到“ NullPointerException ”为什么?

3 个答案:

答案 0 :(得分:0)

你需要这样做,上下文应该作为活动给出,因为你试图给出一个活动的引用,所以你的asynctask类无法识别,所以你需要提供对你的活动的引用从as:

调用asynctask
 ProgressDialog dialog;
    Activity mActivity;
    Context mContext;
    String response;
    private OnTaskCompletedInterface listener;

    public PersonGetAsync(Activity activity, Context context, OnTaskCompletedInterface listener) {
        this.listener = listener;

        mContext = activity;
    }

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(mContext);
        String str = "Connexion en cours";
        dialog.setTitle(str + "...");
        dialog.setIndeterminate(false);
        dialog.setCancelable(true);
        dialog.show();
    }

我现在也看到你没有在你的activity中实现onCreate()方法。而不是使用构造函数你可以在onCreate()中调用async

答案 1 :(得分:0)

不要在Activity子类上实现构造函数。

请勿尝试使用Activity(在其上调用方法或将其作为参数传递给其他人)直到onCreate()方法内部,并且通常直到调用super.onCreate()为止

您崩溃的原因是,当您尝试将Activity类用于PersonGetAsync时,PersonGetAsync尚未初始化。延迟super.onCreate()的创建和使用,直到onCreate() PersonBlueActivity OrderBy方法Select之后调用。

答案 2 :(得分:0)

你永远不应该使用Activity的实际构造函数。

覆盖Activity生命周期功能并在那里完成工作。

当您尝试将其与进度对话框一起使用时,您的上下文为空的原因是因为它尚未设置。活动的上下文在活动的生命周期函数中设置,并且当构造函数首先被调用时,这还没有发生。

将所有构造函数代码移动到onCreate,一切都会好的。 onCreate函数也会被调用一次,就像构造函数一样。