我创建了活动,它应该在用户单击按钮后返回 GeoPoint 数组。执行http请求和解析应答的代码被提取到AsyncTask。在里面onPostExecute()
我分配的方法overlayList
返回值doInBackground()
方法,但是没有用,并且
overlayList.size()
抛出 NullPointerException。这是我的原始代码:
public class MyActivity extends Activity {
Button bt;
TextView tv1;
List<GeoPoint> overlayList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt = (Button) findViewById(R.id.button);
tv1 = (TextView) findViewById(R.id.textView);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String query = "http://maps.googleapis.com/maps/api/directions/json?origin=bla-bla&destination=bla-bla&sensor=false";
Request mat = new Request();
mat.execute(query);
if (overlayList.size() > 0){
tv1.setText("List is OK!");
}
}
});
}
private class Request extends AsyncTask<String, Void, ArrayList<GeoPoint>> {
@Override
protected ArrayList<GeoPoint> doInBackground(String... params) {
return parse(connect(params[0]));
}
@Override
protected void onPostExecute(ArrayList<GeoPoint> geoPoints) {
super.onPostExecute(geoPoints);
overlayList = geoPoints;
}
public JSONObject connect(String url) {
...
}
public ArrayList<GeoPoint> parse(JSONObject jsonObject) {
...
}
}
但如果我修改我的OnClickListener
以这样的方式:
HttpRequest mat = new HttpRequest();
mat.execute(query);
try {
overlayList = mat.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
一切顺利并且overlayList.size()
返回列表的大小。所以,我的问题 - 为什么是onPostExecute()
方法不初始化我的列表?
An AsyncTask
正如它的名字所暗示的那样——doInBackground(...)
方法在单独的线程上异步运行,而代码在onCreate(...)
继续运行。
在你的代码中...
mat.execute(query);
if (overlayList.size() > 0){
tv1.setText("List is OK!");
}
...the if
检查条件立即地当你打电话之后mat.execute(query)
。换句话说,你的AsyncTask
还没有机会执行它doInBackground(...)
method.
移动此代码...
if (overlayList.size() > 0){
tv1.setText("List is OK!");
}
...进入onPostExecute(...)
你的方法AsyncTask
.
编辑:正如 triggs 在下面的评论中指出的那样,调用get()
的方法AsyncTask
会阻塞主线程,等待结果返回。这有效地使得使用AsyncTask
成为同步操作,在这种情况下,使用AsyncTask
.
我能想到使用的唯一原因get()
方法将来自主(UI)线程之外的线程,尽管我想不出这样做的很多理由。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)