将上下文传递给我的班级存在很大问题。我几乎尝试了所有东西: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();
}
它让我感到“ NullPointerException ”为什么?
答案 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函数也会被调用一次,就像构造函数一样。