android - AsyncTask没有到达onPostExecute() - "应用程序可能在其主线程中做了太多的事情"

时间:2015-04-28 22:14:28

标签: android json android-asynctask gson

我有一个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);

现在,当我滑动到此片段时,应用停止工作。 先谢谢你们。

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。您可以使用doInBackgroundpublishProgress(...);将项目添加到列表中。或者在AsyncTask中创建本地列表,并将所有项添加到onProgressUpdate

中的全局列表中