为什么主线程上有太多工作?

时间:2015-05-11 01:31:12

标签: java android mysql multithreading asynchronous

因此,我尝试创建一个简单的应用程序,使存储组事件在MySQL数据库中然后检索它们以供人们加入。在这个片段中,我通过使用JSONParser类来查询数据库来列出所有事件。我使用Async类进行查询。片段最初将在启动时或每当用户决定通过在微调器中选择某些内容或用户按下刷新按钮来限制事件范围时查询数据库。我一直在收到像

这样的消息
  

编舞:跳过95帧!应用程序可能在其主线程上做了太多工作。

在运行程序时,我不确定原因。我想这可能是因为我过多地调用Async类,但我不确定。

public class mainActivityFragment extends Fragment {

    final public String information = "information";

    public Spinner specifySubject;

    private ArrayList<String> list = new ArrayList<>();
    private ArrayList<EventObject> eventList = new ArrayList<>();

    JSONParser jsonParser = new JSONParser();

    ListView test;
    ArrayAdapter adapter;

    // url to create new product
    private static String url_get_event = "";

    private ProgressDialog pDialog;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.activity_main, container, false);
        adapter = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1, list);
        test = (ListView) v.findViewById(R.id.listView);

        new CreateNewProduct().execute();

        if(pDialog.isShowing()){
            pDialog.dismiss();
        }

        test.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
                Intent in = new Intent(getActivity(), AttendInformation.class);

                EventObject clickedEvent = eventList.get(position);

                String[] testInformation = {clickedEvent.getTo().toString(), clickedEvent.getLocation(), clickedEvent.getTitle(), clickedEvent.getDurationString(), clickedEvent.getDescription(), clickedEvent.getSubject()};
                in.putExtra(information, testInformation);
                startActivity(in);
            }
        });

        Button createEventButton = (Button) v.findViewById(R.id.Button2);

        createEventButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Intent in = new Intent(getActivity(), createEvent.class);

                startActivity(in);
            }
        });

        specifySubject = (Spinner) v.findViewById(R.id.spinner);
        specifySubject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                AsyncTask task;
                task = new CreateNewProduct().execute();
                try {
                    task.get(3000, TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }

                if (position == 0) {

                } else {
                    String selectedSubj = getResources().getStringArray(R.array.class_array)[position];
                    for (int i = 0; i < eventList.size(); i++) {
                        if (!eventList.get(i).getSubject().equals(selectedSubj)) {
                            list.remove(list.indexOf(eventList.get(i).getTitle()));
                            eventList.remove(i);
                            i--;
                        }
                    }
                    adapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

        Button refresh = (Button) v.findViewById(R.id.leftButton);
        refresh.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AsyncTask task;
                task = new CreateNewProduct().execute();
                try {
                    task.get(3000, TimeUnit.MILLISECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }

                if (specifySubject.getSelectedItemPosition() == 0) {

                } else {
                    String selectedSubj = getResources().getStringArray(R.array.class_array)[specifySubject.getSelectedItemPosition()];
                    for (int i = 0; i < eventList.size(); i++) {
                        if (!eventList.get(i).getSubject().equals(selectedSubj)) {
                            list.remove(list.indexOf(eventList.get(i).getTitle()));
                            eventList.remove(i);
                            i--;
                        }
                    }
                    adapter.notifyDataSetChanged();
                }
            }
        });

       return v;
    }

    class CreateNewProduct extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Getting Events...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        protected String doInBackground(String... args) {
            JSONArray jsonArr = jsonParser.getJSONFromUrl(url_get_event);
            for(int n = 0; n < jsonArr.length(); n++)
            {
                try {
                    JSONObject object = jsonArr.getJSONObject(n);
                    if(!list.contains(object.getString("title"))){
                    String[] time = object.getString("time").split(":");
                    time[1] = time[1].substring(0, 2);
                    EventObject tempEven = new EventObject(object.getString("title"), object.getString("location"), object.getString("description"), object.getString("subject"), 0, new TimeObject(Integer.parseInt(time[0]), Integer.parseInt(time[1])));
                    eventList.add(tempEven);
                    list.add(object.getString("title"));

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
            return null;
        }

        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            test.setAdapter(adapter);
            pDialog.dismiss();
        }

    }
}

0 个答案:

没有答案