我有一个Fragment,我想在其中解析JSON并创建一个包含其某些属性的ArrayList,然后将ArrayList的数据放到Spinner中。但是,我不知道我是否正在做AsyncTask。 每当我尝试一种新方法从我的片段活动中的URL解析JSON时,应用程序与&#34崩溃;不幸的是,应用程序已停止"消息或Spinner保持空白。我用Logs验证我从未到过AsyncTask上的onPostExecute()方法。 问题: - 我究竟做错了什么? - 我应该使用AsyncTask吗?
我的代码:
private class LoadResources extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.v(TAG, "pre-execute");
}
// Call after onPreExecute method
@Override
protected String doInBackground(String... urls) {
Log.v(TAG, "background");
Log.v(TAG, urls[0]);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
try {
URL u = new URL(urls[0]);
BufferedReader in = new BufferedReader(new InputStreamReader(u.openStream(), Charset.forName("UTF-8")));
StringBuilder sb = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
// the above parsing works, I've tested
JsonParser parser = new JsonParser();
JsonElement elem = parser.parse(sb.toString());
JsonArray array = elem.getAsJsonArray();
for (int i = 0; i < array.size(); i++) {
JsonElement elem1 = array.get(i);
JsonArray tmpArr = elem1.getAsJsonArray();
for (JsonElement elem2 : tmpArr) {
elem2.getAsJsonObject().getAsJsonPrimitive().getAsString());
myArrayList.add(elem2.getAsJsonObject().getAsJsonPrimitive("name").toString());
return urls[0];
}
protected void onPostExecute(String params) {
Log.v(TAG, params);
}
}
on onCreateView:
LoadResources loader = new LoadResources();
loader.execute("http://localhost:5000/avalidpath);
text = (AutoCompleteTextView) rootView.findViewById(R.id.nomeAluno);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item, myArrayList);
text.setAdapter(adapter);
text.setThreshold(3);
现在,当我滑动到此片段时,应用停止工作。 先谢谢你们。
答案 0 :(得分:2)
实际上你应该在doInBckground方法中做繁重的工作。
onPostExecute(Result),在后台计算完成后在UI线程上调用。背景计算的结果作为参数传递给该步骤。文件here
编辑:
class LoadResources extends AsyncTask<String, Void, ArrayList<String>> {
Context context;
public LoadResources(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... urls) {
...
return myArrayList;
}
protected void onPostExecute(ArrayList<String> params) {
((YourActivity)context).setMyAdapter(params);
}
}
在你的活动(片段或其他)中:
public void setMyAdapter(ArrayList<String> params) {
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item, myArrayList);
text.setAdapter(adapter);
}
答案 1 :(得分:1)
onPostExecute在UI线程上完成。你有太多的工作。所有不直接影响UI元素的东西都应该在doInBackground中完成。现在你的doInBackground什么也没做。
答案 2 :(得分:0)
将整个代码从module nganimaltracker {
export class TrayController implements ITrayController{
public startTracker() {
var monitor = new animalPositionMonitor(this);
this.animalTrackerServices.TrackPosition(monitor, this.errorCallbackFn);
}
}
}
var animalPositionMonitor: any = (() => {
var jsClass: any = (trayController: ITrayController) => {
**var monitor = this;**
var me: IGenXStreamHandler<IAnimal> = new GenXStreamHandler('Animal');
me.process = animal => {
var ll = **monitor["trayController"].gridOptions.data.length**;
}
}
}
移至onPostExecute
。您可以使用doInBackground
和publishProgress(...);
将项目添加到列表中。或者在AsyncTask中创建本地列表,并将所有项添加到onProgressUpdate