У меня две задачи, выполняемые в 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);
}
}
Как мне справиться с этими двумя задачами? Пожалуйста, предложите мне какое-нибудь решение, чтобы оно заняло минимум времени. Пожалуйста, ответь мне быстро. Спасибо заранее.
1 ответ
На ум приходит пара подходов. Первый - реализовать onProgressUpdate(Progress...)
с передачей String
и установить значение TextView
в этом методе. Затем вы должны вызвать updateProgress
после завершения загрузки, но до начала синтаксического анализа. Это будет минимальный объем вашей работы, чтобы заставить это работать.
Другой способ - создать новый AsyncTask
только с кодом синтаксического анализа. Первый AsyncTask
(который теперь будет просто выполнять загрузку) установит содержимое TextView
и начнет синтаксический анализ AsyncTask
в его onPostExecute
.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.