AsyncTask отображает индикатор выполнения

Я очень новичок в андроиде. У меня есть два действия A, B . Действие A анализирует данные с сервера и выполняет итерацию по уровням. и вызывает действие B через намерение. Действие B требует некоторого времени для отображения данных, поэтому я пытаюсь отобразить индикатор выполнения. Вот мой код.

 public class Display extends Activity  {

        ProgressDialog dialog;


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

            new asynctask().execute();


        }

        class asynctask extends AsyncTask<Context,Void,Void>{
            Survey[] surveyque=null;
    // i hace created seperated class forsurvey that has info about data
            String list[];  


            private ProgressDialog Dialog;
            @Override
            protected void onPreExecute()
            {
                Dialog=ProgressDialog.show(Display.this, "Parsing Data", "Please wait..........");


            }
            @Override
            protected void onPostExecute(Void unused)    
            {
                try
                {
                    if(Dialog.isShowing())
                    {
                        Dialog.dismiss();
                    }
                    Intent intent=getIntent();

                }
                catch(Exception e)
                {
    Log.d("Onsitev4", "error");
                }
            }

            @Override
            protected Void doInBackground(Context... params) {
                try {

                    LinearLayout layout1 = (LinearLayout) findViewById(R.id.linearLayout1);

    //getting exception here. I dont understant why
    // I have declared layout params and displaying activities in another class 

                    ButtonView c = new ButtonView();                
                    c.layout=layout1;
                    c.context =getBaseContext();


                    DbCoreSqlSurveys surveys=new DbCoreSqlSurveys(getBaseContext());
                    Document doc =surveys.getSurveySet();
                    surveyquestions= GetSurveyLevels(doc,c );


                } catch (TransformerFactoryConfigurationError e) {
                    e.printStackTrace();
                }
                return null;
            } 

        }

        public SurveyObject[] GetSurveyLevels(Document doc, ButtonView c) {
            NodeList nlQuestions = doc.getElementsByTagName("Survey");
            SurveyObject[] allsurveys = new SurveyObject[nlQuestions.getLength()];


            for (int i = 0; i < nlQuestions.getLength(); i++){

                Node survey =  nlQuestions.item(i);
                String f =survey.getNodeName();
                Log.d("OnsiteV4", "survey " + f);

                NodeList surveyChildNodes = survey.getChildNodes();
                SurveyObject s=new SurveyObject();

                for (int j = 0; j < surveyChildNodes.getLength(); j++){

                    Node surveyChild =  surveyChildNodes.item(j);               
                    String h =surveyChild.getNodeName();
                    Log.d("OnsiteV4", "survey child node = " + h);

                    if (h !="#text"){
                        Surveys t = Surveys.valueOf(h); 

                        switch(t){
                        case KeySurvey:
                            s.KeySurvey=surveyChild.getTextContent();
                            displaySurveyLink(s.SurveyDescription,"",c,0,s.SurveyDescription,"","","","");
                            break;
                        case SurveyDescription:
                            s.SurveyDescription=surveyChild.getTextContent();
                            displaySurveyLink(s.SurveyDescription,"",c,0,s.SurveyDescription,"","","","");
                            break;
                        case SurveyUserCode:
                            s.SurveyUserCode=surveyChild.getTextContent();
                            break;
                        case Level1:
                            if(surveyChild.hasChildNodes()){
                                s.Level1=   processLevel1Nodes(surveyChild,c,s.SurveyDescription);
                            }
                            break;
                        default:
                            break;
                        }
                    }

                    allsurveys[i]=s;
                }
            }

            return allsurveys;
        }

    // methods iterating through levels that is not showed

        private  void displaySurveyLink(final String description, String tag, ButtonView c, int indentation, final String surveyDescription, final String level1description, final String level2description, final String level3description, final String level4description)
        {
            if (description == null || tag == null){
                return;
            }
            final TextView tv = c.addButton(description,tag,indentation);


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

                    final Intent intent = new Intent();
                    intent.setClass(v.getContext(),ActivityB.class);
                    intent.putExtra("KeyLevel",tv.getTag().toString()); 

                    intent.putExtra("SurveyDescription",surveyDescription);
                    intent.putExtra("level1description",level1description);
                    intent.putExtra("level2description",level2description);
                    intent.putExtra("level3description",level3description);
                    intent.putExtra("level4description",level4description);
                    intent.putExtra("Description",description);

                    if (tv.getTag() != null){
                        if (tv.getTag().toString() != ""){
                            startActivity(intent);
                        }


                    }
                }


            });
        }
    }  

Я получаю исключение в doinbackground. Я сбит с толку . пожалуйста, помогите мне..


person noname    schedule 20.01.2012    source источник
comment
Какое исключение вы получили. Вы можете добавить свой логарифм? Я думаю, что ваша проблема может заключаться в том, что вы пытаетесь обновить поток пользовательского интерфейса из другого потока (aSyncTask)   -  person SERPRO    schedule 20.01.2012
comment
Если вы начинаете новое намерение в своей асинхронной задаче, вы должны закрыть индикатор выполнения. Пожалуйста, опубликуйте свои ошибки.   -  person Mal    schedule 20.01.2012
comment
E/AndroidRuntime(16904): java.lang.RuntimeException: произошла ошибка при выполнении doInBackground(), в java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)... это мое исключение, я получающий   -  person noname    schedule 20.01.2012


Ответы (2)


Вы получаете исключение, потому что вы обращаетесь к элементам пользовательского интерфейса в потоке, отличном от пользовательского интерфейса. Основной поток, создаваемый приложением, — это поток пользовательского интерфейса, именно в нем создаются все ваши визуальные элементы и, следовательно, это единственный поток, в котором вы должны получить к ним доступ.

Чтобы правильно использовать AsyncTask, вы запускаете свои длительные операции в doInBackground и используете onPreExecute, onPostExecute и onProgressUpdated для работы с пользовательским интерфейсом (показывать/скрывать диалоговые окна прогресса, обновлять представления и т. д.). Всякий раз, когда я использую AsyncTask и хочу показать прогресс, я переопределяю onProgressUpdated, присваивая ему тип параметра Integer, и вызываю publishProgress из doInBackground. Это потребует изменения подписи базового класса с AsyncTask<Context,Void,Void> на AsyncTask<Context,Integer,Void>. Вы также можете использовать другие типы объектов для этого... Я просто использую Integer в качестве примера, если вы хотите, например, показать процент выполнения задачи.

person Rich    schedule 20.01.2012
comment
может быть глупо спрашивать, можете ли вы объяснить, что здесь за операция пользовательского интерфейса. я пытаюсь проанализировать данные, которые должны работать в фоновом режиме, находятся в нем ?? - person noname; 20.01.2012
comment
когда я говорю пользовательский интерфейс, я имею в виду ваши объекты View (Button, LinearLayout, TextView). Эти вещи создаются в основном потоке, который отображает вещи на экране — это известно как поток пользовательского интерфейса. Этот поток также отвечает за прослушивание и обработку пользовательского ввода (касание экрана, нажатие кнопки и т. д.). Причина, по которой вы выполняете длительные задачи, такие как загрузка или работа с базой данных в фоновом потоке, заключается в том, что поток пользовательского интерфейса всегда доступен для обновления экрана или ответа на ввод пользователя. - person Rich; 20.01.2012

Это потому, что ваш код должен выдавать исключение, когда вы выполняете действия с пользовательским интерфейсом в фоновом режиме задачи asyc. Удалите всю работу, связанную с пользовательским интерфейсом, из метода dobackgound.

person Ravi Bhojani    schedule 20.01.2012
comment
Можете ли вы объяснить мне немного ясно, как изменить. Я знаю, что мне нужно добавить updateprogress, но я немного смущен, чтобы добавить. Извините - person noname; 20.01.2012