2

我只是有一些非常简短的问题AsyncTask

看看这个我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";
     final String TAG_COUNT = "count";
     ProgressDialog pDialog;
     LoadAllData mTask; 

            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>>(); 

    mTask = new LoadAllData();

         mTask.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);

            }     

    @Override
    public void onBackPressed() {              

        if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
        {
            mTask.cancel(true);
        }          
        super.onBackPressed();

    }


    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub

     if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
     {
        mTask.cancel(true);
      }  

        super.onDestroy();

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub


     if (pDialog != null)
     {
         if(pDialog.isShowing())
         {
             pDialog.dismiss();
         }
            super.onPause();

      }  

    }

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


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

        protected String doInBackground(String... args) {  

            pDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
                public void onCancel(DialogInterface dialog) { 
                    mTask.cancel(true); 
                    finish(); 
            } 
       }); 

            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 ChosenAnswer = question.getString(TAG_QUESTION_CHOSENANSWER);
                    String Content = question.getString(TAG_QUESTION_CONTENT);

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

                           map.put(TAG_QUESTION_SUBJECT, Subject);
                           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 null;       

    }

    @Override
    protected void onPostExecute(String file_URL) {

        if(file_URL!=null && file_URL.equals("0")) {  
            pDialog.dismiss();
            Toast.makeText(ListView.this, "No data found", Toast.LENGTH_SHORT).show();
            finish();

        }else{

        if (pDialog != null && pDialog.isShowing()) pDialog.dismiss();
        ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
                    R.layout.listelements,
                    new String[] { TAG_QUESTION_SUBJECT }, new int[] {
                    R.id.Subject,});

            setListAdapter(adapter);                

        }}}

现在我想问的问题是,如果我AsyncTask从当前活动中取出并将其放入不同的文件中,它是否会使我的doInBackGround方法的执行更快。我问这个是因为当我AsyncTask执行时,它需要相当长的时间才能完成,而且在我的 logcat 中,这条消息09-24 20:12:55.928: I/Choreographer(824): Skipped 195 frames! The application may be doing too much work on its main thread.在执行时会填满我的整个 logcat AsyncTask。我只是想知道如果我移动它会有所不同。

4

3 回答 3

2

我只是想知道如果我移动它会有所不同。

不,它不会。

而且, 的行为doInBackground()并不是你困难的根源。它是别的东西,也许是你的onPostExecute(). 该错误对您的问题非常明确(“可能在其主线程上做了太多工作”),并且doInBackground()在另一个线程上完成了它的工作。

于 2013-09-24T23:18:58.053 回答
2

你确定这个代码块属于 doInbackground 方法吗?

pDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
    public void onCancel(DialogInterface dialog) { 
    mTask.cancel(true); 
    finish(); 

}); 

该错误清楚地表明您正在做不适合 UI 线程的额外工作(在上面的代码中并不清楚)

于 2013-09-24T23:22:32.007 回答
0

关于更新的代码-仍然不清楚问题出在哪里。

我建议你检查后台代码并寻找任何接触到活动或 UI 的东西——在后台线程上发出 UI 线程请求可能会导致一些模糊的问题。setOnCancelListener() 是一个。getIntent() 是另一个。将它们注释掉,看看会发生什么。

然后开始分解。注释掉一些代码以将它们从等式中删除,看看它是否改变了任何东西。

在这一点上,这将需要一些寻找,所以越小你可以使错误的代码越好。最终,您将找出导致问题的原因,并从中找出原因。

于 2013-09-26T21:18:41.633 回答