我有一个方法searchPlace()
更新 static Arrays
带有谷歌地图的 A 类 (FindItOnMap) 中的自定义放置对象和方法 updateMap()
更新各个地理点。
我调用这些方法 Button.onClick
并且一切正常。
由于这些方法使用互联网数据,此操作可能需要一段时间,我一直在寻找扩展 YourCustomAsyncTask
的类 A 内部的内部类 B( AsyncTask
) 的实现在这两个方法的处理过程中显示等待对话框
用户建议了这种形式的解决方案(显然似乎有效):
public class FindItOnMap extends MapActivity {
static Place[] foundResults;
private ProgressDialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ricerca_condominio);
mapView = (MapView)findViewById(R.id.mapView);
...........
((ImageButton) findViewById(R.id.btSearch)).setOnClickListener(mSearchListenerListener);
}
OnClickListener mSearchListener = new OnClickListener() {
public void onClick(View v) {
String location=editorLocation.getText().toString();
String name=editorName.getText().toString();
//Call the AsyncTask here
new YourCustomAsyncTask().execute(new String[] {name, location});
}
};
private class YourCustomAsyncTask extends AsyncTask <String, Void, Void> {
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(Main.this);
dialog.setMessage("Loading....");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show(); //Maybe you should call it in ruinOnUIThread in doInBackGround as suggested from a previous answer
}
@Override
protected Void doInBackground(String... strings) {
try {
search(strings[0], string[1]);
return null;
} catch(Exception e) {
}
}
@Override
protected void onPostExecute(Void params) {
updateMapWithResult();
dialog.dismiss();
//result
}
.....
}
显示等待对话框并在后台调用方法,
然而,由于某些奇怪的原因,静态列表 foundResults
结果充满各种null
项目...
这怎么可能?
如果我在内部类之外调用方法 search(location, name) ,则一切正常,并且 updateMapWithResult();
更新所有geopoint,所以这两种方法都可以。仅当我尝试在内部类中调用此函数时,json 调用似乎才起作用,但静态变量 foundResults
充满了null
元素和程序无法正常工作。
有什么建议吗?
最佳答案
我已经明白问题出在哪里了。 您必须在 UI 线程上运行搜索方法。
因此更改此代码块:
@Override
protected Void doInBackground(String... strings) {
try {
search(strings[0], string[1]);
return null;
} catch(Exception e) {
}
}
有了这个
@Override
protected Void doInBackground(final String... strings) {
try {
runOnUiThread(new Runnable() {
public void run() {
search(strings[0], string[1]);
return null;
}
});
} catch(Exception e) {
e.printStackTrace();
}
}
一切都应该正常工作。
关于android - AsyncTask作为内部类和静态字段问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404586/