2013-09-24 54 views
2

我只是有一些非常簡單的問題有關AsyncTask如果我將它移動到不同的文件,我的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中,當AsyncTask正在執行時,這條消息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。我只是想知道如果我移動它會有所作爲。

+2

'應用程序可能在其主線程上做了太多工作'不要在主線程上工作。 – SLaks

+0

不清楚問題出在您粘貼的代碼中。您可能希望包含代碼的其餘部分。 –

+0

@DavidSainty你有沒有看到我更新的問題? –

回答

2

我只是想知道它會有所作爲,如果我移動它。

不,它不會。

此外,doInBackground()的行爲不是你的困難的來源。這是別的,也許你的onPostExecute()。該錯誤非常明確地表明您的問題(「可能在其主線程上做了太多工作」),並且doInBackground()在另一個線程上工作。

+0

我在'onPostExecute'中有兩個'if'語句可能就是這樣吧 –

+0

@InmanDouche:我不知道。使用Traceview來確定您的特定性能問題的位置。 – CommonsWare

2

您確定此代碼塊屬於doInbackground方法嗎?

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

}); 

錯誤明確指出,你正在做一些額外的工作不適合UI線程(這是不是在上面的代碼中明確)

+0

我的聽衆取消asynctask –

+2

同意,這應該在'onPreExecute()',而不是'doInBackground()'完成。雖然它不是減速的來源,但所有涉及UI的工作都應該在主應用程序線程上完成。 – CommonsWare

0

關於更新的代碼 - 它仍然是不明確的問題出在哪裏。

我建議你仔細閱讀後臺代碼,並尋找任何接觸活動或用戶界面的東西 - 可能會在後臺線程上發出UI線程請求導致一些模糊問題。 setOnCancelListener()是一個。 getIntent()是另一個。評論他們,看看會發生什麼。

然後開始分解它。註釋掉一些代碼,將它們從等式中移除,看它是否改變了任何東西。

在這一點上需要一點狩獵,所以你可以使錯誤代碼越小越好。最終你會找出造成問題的原因,並從中找出原因。

相關問題