我有一個對象,MyObject
,用一些隨機數填充自己。這不需要很長時間,看起來是瞬間的。但是,這些值在用戶界面上使用,有時在構建用戶界面時還沒有完全準備好。AsyncTask沒有等待完成之前創建的對象
我創建了一個用於實例化對象的AsyncTask
,它在本文後面。
但是doInBackground(...)
在以這種方式調用onPostExecute(...)
之前沒有完全實例化對象。
protected MyObject doInBackground(Void... unused) {
// this may take a few moments and cause a null reference
// so make a task
MyObject obj = new MyObject();
return obj;
}
我也試着用一個標誌來表示完成,但它似乎也不能保證。
MyObject obj = new MyObject();
while (obj.isComplete() == false) {
// do nothing. Wait for completion
}
return obj;
裏面的MyObject
簡單
public MyObject() {
createValues(); // entire object created with this
this.mComplete = true;
}
它失敗少,但仍然沒有。 createValues()
使用ArrayList
作爲其計算的一部分,如果這是造成競爭條件。
下面是使用methodCall()
中的任務的示例MyFragment
。
問題我該如何等待,直到MyObject
完全實例化爲止?
堆棧跟蹤
java.lang.NullPointerException
at MyFragment.setupFragment(MyFragment.java:95)
at MyFragment.onTaskComplete(MyFragment.java:143)
at MyTask.onPostExecute(MyTask.java:37)
at MyTask.onPostExecute(MyTask.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:631)
片段
public class MyFragment extends Fragment implements MyTask.OnTaskComplete {
private MyObject mMyObject;
// ...
public void methodCall() {
// generate puzzle and set it up in the background
MyTask task = new MyTask(this);
task.execute();
}
function void setupFragment() {
// null pointer exception here
// mMyObject is not initiated yet and only some times
// values is an array of integers
int example = this.mMyObject.values[0];
}
@Override
public void onTaskComplete(MyObject obj) {
// returned from MyTask
this.mMyObject = obj;
this.setupFragment();
}
}
的AsyncTask
public class MyObjectTask extends AsyncTask<Void, Void, MyObject> {
public static interface OnTaskComplete {
public abstract void onTaskComplete(MyObject obj);
}
static final String TAG = "MyObjectTask";
private OnTaskComplete mListener;
public MyObjectTask(OnTaskComplete listener) {
this.mListener = listener;
}
@Override
protected MyObject doInBackground(Void... unused) {
// this may take a few moments and cause a null reference
// so make a task
return new MyObject();
}
@Override
protected void onPostExecute(MyObject obj) {
this.mListener.onTaskComplete(obj);
}
}
'mListener'可以'null' – Geros 2013-02-17 02:13:04
好點。我會確保捕獲那個 – Kirk 2013-02-17 02:27:15