0

我有兩個任務在doInBackground()中運行。一項任務是從網站讀取數據,另一項任務是解析Url中的xml文件並在imageview中設置圖像。但是我想分離這兩個任務意味着一旦從網站的閱讀完成後,它應該在textview中設置文本。之後xml解析應該開始。那我能做些什麼?AsyncTask中的句柄處理Android

這裏是我的代碼:

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

我應該如何處理這兩個任務?請給我建議一些解決方案,以便花費最少的時間。請快回復我。提前Thanx。

+0

第一次asynctask完成後,你會得到onPostExecuate()的結果剛開始另一個asynctask – Sumant

回答

0

想到了一些方法。首先是實施onProgressUpdate(Progress...)傳遞String並在此方法中設置TextView的值。下載完成後,在解析開始之前,您將會撥打updateProgress。這將是你工作的最低工作量。

另一種方法是創建一個新的AsyncTask,其中只有解析代碼。第一個AsyncTask(現在只是執行下載)將設置TextView內容並在其onPostExecute中開始解析AsyncTask

+0

好吧,我正在嘗試.. – zanky

+0

我已經完成了第一種方法。但是當我用第二種方法嘗試時,在完成兩個我不想要的任務後,我的視圖被設置。第一種方法已經完成,這完成了下載後的觀點。所以感謝隊友。你真的幫我。 – zanky