我在Android应用中请求来自网络服务的信息。 Web服务返回一个项目列表,每个项目都有一个base64图像和一些信息
第一种方法:只需访问Web服务并获取结果。这意味着冻结UI直到下载数据。不是一个好的解决方案
第二种方法:将数据下载放在一个线程中,并显示一条带有消息的进度条。
private void StartGettingData()
{
viewInfo = new Runnable(){
public void run() {
getData(); //from the web service
}
};
Thread thread = new Thread(null, viewInfo, "MagentoBackground");
thread.start();
progressDialog = ProgressDialog.show(TracksListActivity.this,
"Please wait...", "Retrieving data from WEB...", true);
}
private void getData(){
{
get data from web service into a list and then
runOnUiThread(returnRes);
}
private Runnable returnRes = new Runnable() {
public void run() {
populate the listview adapter with info from the web service result list and
progressDialog.dismiss();
generalTrackInfoAdapter.notifyDataSetChanged();
}
};
这显示了一个很好的加载图像和消息。用户必须等到所有下载完成。我不知道如何取消getdata()线程。
第三种方法:我希望有类似的东西,用户按下按钮获取数据,线程逐项从Web服务下载并立即在列表中显示。使用按钮总是可以取消请求。
但是,怎么做?或者还有另一种方式吗?
答案 0 :(得分:3)
您可以使用 AsyncTask 进行线程化,基础知识:painless threading,例如:Multithreading For Performance(image downloader)。
因为使用类线程或可运行的接口,您的代码会变得更复杂,更难以阅读。当您实现需要频繁更新UI的复杂操作时,情况会变得更糟。
AsyncTask的目标是为您处理线程管理。
基本结构是:
public class DownloaderTask extends AsyncTask<String, String, String>{
protected void onPreExecute(){}
protected String doInBackground(String....args){
//do something in background
}
protected void onProgressUpdate(String str){}
protected void onPostExecute(String result){
//..update ui
}
}
......开始你的任务,例如:
public void onClick(View v){
new DownloaderTask().execute("param");
}
doInBackground()方法执行 自动在工作线程上
onPreExecute(),onPostExecute()和 onProgressUpdate()都被调用 UI线程
返回的值 doInBackground()被发送到 onPostExecute()
您可以在中调用publishProgress() 随时在doInBackground()中 在UI上执行onProgressUpdate() 螺纹
您可以随时取消任务, 来自任何主题