Android活动生命周期与asynctask

时间:2013-08-21 02:00:55

标签: android android-lifecycle

我一直在研究活动生命周期以及它们如何释放可用空间,以便我的应用程序可以运行得更顺畅。它只是我想将这些方法用于我的一个活动,因为当我的PDialog启动时,我的数据加载需要相当长的时间。我一直在查看我的代码以查看我可以放置这些方法的位置,所以当我的活动执行我的asynctask时,那将是我想要在那个时间点运行的唯一东西。下面的代码将清除。

    public class ListView extends ListActivity {    


        ArrayList<HashMap<String, String>> questionList;        

         final String TAG_RESULTS = "results";
         final String TAG_QUESTION_SUBJECT = "Subject";
         final String TAG_QUESTION_NUMANSWERS = "NumAnswers";
         final String TAG_QUESTION = "question";
         final String TAG_QUESTION_CONTENT = "Content";
         final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer";
         final String TAG_ANSWERS = "Answers";
         final String TAG_ANSWER = "Answer";    
         final String TAG_ANSWERS_CONTENT = "content";      
         final String TAG_QUERY = "query";

                JSONArray question = null;          
                android.widget.ListView lv;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); 
            //setContentView(R.layout.listview);        

        questionList = new ArrayList<HashMap<String, String>>(); 


        new LoadAllData().execute();

            }


        @Override   
        protected void onListItemClick(android.widget.ListView l, View v, int pos, long id) {
             super.onListItemClick(l, v, pos, id);  

              HashMap<String, String> item = questionList.get(pos);

              Intent i = new Intent(ListView.this, SingleListItem.class);
              i.putExtra(TAG_QUESTION_SUBJECT, item.get(TAG_QUESTION_SUBJECT));
              i.putExtra(TAG_QUESTION_CONTENT, item.get(TAG_QUESTION_CONTENT));
              i.putExtra(TAG_QUESTION_CHOSENANSWER, item.get(TAG_QUESTION_CHOSENANSWER));
              startActivity(i);

                }     

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


            private Dialog pDialog;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                ProgressDialog pDialog; 
                pDialog = new ProgressDialog(ListView.this);
                pDialog.setMessage("Loading Data. Please wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }

            protected String doInBackground(String... args) {

                try {
                    Intent in = getIntent();
                    String searchTerm = in.getStringExtra("TAG_SEARCH");
                    String query = URLEncoder.encode(searchTerm, "utf-8");
                    String URL = "http://example.com";
                    JSONParsser jParser = new JSONParsser();
                    JSONObject json = jParser.readJSONFeed(URL);
                    try {

                        JSONArray questions = json.getJSONObject("all").getJSONArray("questions");

                        for(int i = 0; i < questions.length(); i++) {
                            JSONObject question = questions.getJSONObject(i);


                        String Subject = question.getString(TAG_QUESTION_SUBJECT);
                        String NumAnswers = question.getString(TAG_QUESTION_NUMANSWERS);
                        String ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
                        String Content = question.getString(TAG_QUESTION_CONTENT);

                        //JSONArray Answers = question.getJSONObject(TAG_ANSWERS).getJSONArray(TAG_ANSWER);


                        //JSONObject Answer = Answers.getJSONObject(0);

                        //String Content = Answer.getString(TAG_ANSWERS_CONTENT);

                                   HashMap<String, String> map = new HashMap<String, String>();

                                   map.put(TAG_QUESTION_SUBJECT, Subject);
                                   map.put(TAG_QUESTION_NUMANSWERS, NumAnswers);
                                   map.put(TAG_QUESTION_CONTENT, Content);
                                   map.put(TAG_QUESTION_CHOSENANSWER, ChosenAnswer);

                                   questionList.add(map);


                        }


                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                    return TAG_QUESTION ;           

            }

            @Override
            protected void onPostExecute(String file_URL) {
                if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
                            R.layout.listelements,
                            new String[] { TAG_QUESTION_SUBJECT, TAG_QUESTION_NUMANSWERS }, new int[] {
                            R.id.Subject, R.id.NumAnswers, });

                    setListAdapter(adapter); 


            }

        }

        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
        }

    }

在我之前的课程中,我已经放了onStop来释放一些空间。但是我希望现在当我说我只想要PDialog和我的asynctask在那个时间点运行时,你可以看到更多我的意思,这样我的PDialog就不会减慢这个过程。

1 个答案:

答案 0 :(得分:0)

对我而言,实际上并不清楚有什么问题。如果一些新手来到这里并阅读,可以参考两个重点。

  1. 需要一些时间列表来加载,因为它是长时间操作。 AsyncTask的目的是 保持UI不被阻止 。它的目的不是为了将事物加速到无穷大(顺便说一句,即使光速是极限)。
  2. 此代码中的
  3. onStop()没用,它什么也没做。即使您完全删除了覆盖的super.onStop()方法,也会调用onStop,因为基类ListActivity是从具有此方法的Activity扩展而且将被调用。您只需拨打super.onStop()
  4. 即可添加任何内容
  5. 仅用于记录onPreExecutingonPostExecute正在主(UI)线程上执行.. doInBackground正在单独的线程中运行,但Android包装了一切对你好的所以这些方法在适当的时候执行一个接一个的线程。
  6. 好像你不知道为什么但是你的doInBackground方法需要返回一些字符串,所以你返回的任何字符串TAG_QUESTION)..;)而不是onPostExecute接受String作为参数,但当然你没有使用它。那里需要字符串,因为你声明AsyncTask <String,String,String>并不知道那是什么。
  7. 希望有些关于AsyncTask class的资料可以帮助那些来到这里的人

相关问题