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は、実行中に終了するのにかなりの時間がかかり、logcat09-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() はその 1 つです。getIntent() は別のものです。それらをコメントアウトして、何が起こるか見てみましょう。

それからそれを分解し始めます。コードの一部をコメントアウトして方程式から削除し、何かが変わるかどうかを確認します。

この時点で少し探索が必要になるため、誤ったコードを小さくできるほど優れたものになります。最終的には、何が問題を引き起こしているのかを突き止め、そこから理由を突き止めることができます。

于 2013-09-26T21:18:41.633 に答える