У меня две задачи, выполняемые в doInBackground (). Одна задача - это чтение данных с сайта, а другая задача - разобрать XML-файл из URL-адреса и установить изображение в просмотре изображений. Но я хочу разделить обе задачи, означает, что после завершения чтения с сайта он должен установить текст в текстовом виде. и после этого должен начаться синтаксический анализ xml. Так что я могу сделать ?

Вот мой код:

private class DownloadWebPageTask extends AsyncTask<String, Void, ArrayList<String>>
    {
        ProgressBar progressBar;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            progressBar = (ProgressBar)findViewById(R.id.showLoading);
            progressBar.bringToFront();         

        }

        @Override
        protected ArrayList<String> doInBackground(String... arg0)
        {
            String xml = null;

            ArrayList<String> lyricArtistArray = new ArrayList<String>();

                    //get lyrics - First task
            lyricsArray = SearchHelper.findLyrics(arg0[0],arg0[1]);
            lyricArtistArray.add(lyricsArray);

                //get image - Second task
            artistNameGlobal = arg0[1].toString();
            try
            {
                XMLParser parser= new XMLParser();
                String img;
                String t = arg0[1].replace(" ","%20");
                String url = "http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist="+t+"&api_key=mykey";
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                xml = EntityUtils.toString(httpEntity);
                Document doc = parser.getDomElement(xml);
                NodeList nl = doc.getElementsByTagName("artist");
                for(int i=0;i<1;i++)
                {
                    Element e = (Element)nl.item(i);
                    img = parser.getValue(e,"image");
                    System.out.print(img);
                    ImageView imageArtist = (ImageView) findViewById(R.id.artistImageView);
                    imageArtist.setImageBitmap(LoadImageFromURL(img));
                }               
            }
            catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }

            return lyricArtistArray;
        }

        @Override
        protected void onPostExecute(ArrayList<String> lyricArtistArray)
        {
            progressBar.setVisibility(View.GONE);

            tvMain.setTextSize(fontSize);
            tvMain.setTextColor(FontColor);
            if(!FontStyle.equals("None"))
            {
                String s = FontStyle.concat(".ttf");
                String s1 = "fonts/"+s;
                Typeface tf=Typeface.createFromAsset(getAssets(),s1);
                tvMain.setTypeface(tf); 
            }

            tvMain.setText(Html.fromHtml(lyricArtistArray.get(0).toString()));
            tvMain.setMovementMethod(new ScrollingMovementMethod());                    
            tvMain.setSelected(true);       
        }
    }

Как мне справиться с этими двумя задачами? Пожалуйста, предложите мне какое-нибудь решение, чтобы оно заняло минимум времени. Пожалуйста, ответь мне быстро. Спасибо заранее.

0
Zankhna 10 Дек 2012 в 14:11
После завершения первой асинтаксической задачи вы получите результат в onPostExecuate (), просто запустите другую асинтаксическую задачу
 – 
Sumant
10 Дек 2012 в 14:22

1 ответ

Лучший ответ

На ум приходит пара подходов. Первый - реализовать onProgressUpdate(Progress...) с передачей String и установить значение TextView в этом методе. Затем вы должны вызвать updateProgress после завершения загрузки, но до начала синтаксического анализа. Это будет минимальный объем вашей работы, чтобы заставить это работать.

Другой способ - создать новый AsyncTask только с кодом синтаксического анализа. Первый AsyncTask (который теперь будет просто выполнять загрузку) установит содержимое TextView и начнет синтаксический анализ AsyncTask в его onPostExecute.

0
dave.c 10 Дек 2012 в 14:29
Я закончил с первым подходом. Но когда я попробовал второй подход, мое представление было установлено после выполнения обеих задач, которых я не хочу. Так поступили с первым подходом, который установил мой взгляд после завершения загрузки. Так что спасибо, дружище. Ты действительно помогаешь мне.
 – 
Zankhna
10 Дек 2012 в 19:33