Android 线程化web服务调用

Android 线程化web服务调用,android,web-services,asynchronous,Android,Web Services,Asynchronous,我正在从android应用程序中的web服务请求信息。web服务返回一个项目列表,每个项目都有一个base64图像和一些信息 第一种方法:简单地访问web服务并获得结果。这意味着在下载数据之前冻结UI。这不是个好办法 第二种方法:将数据下载放在一个线程中,并显示一个带有消息的进度条 private void StartGettingData() { viewInfo = new Runnable(){ public void run() {

我正在从android应用程序中的web服务请求信息。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服务中逐项下载数据,并立即在列表中显示。用户始终可以通过按下按钮取消请求


但是,如何做到这一点呢?或者还有其他方法吗?

您可以使用异步任务来执行线程,基本知识:,例如:

因为使用类线程或接口runnable,代码变得更复杂,更难阅读。当您实现需要频繁更新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
    }
}
  • 执行doInBackground()方法 在工作线程上自动执行

  • onPreExecute()、onPostExecute()和 onProgressUpdate()都是在上调用的 UI线程

  • 返回的值 doInBackground()被发送到 onPostExecute()

  • 您可以在以下位置调用publishProgress() 在doInBackground()中的任何时间 在UI上执行onProgressUpdate() 线

  • 您可以随时取消任务, 从任何线索

public void onClick(View v){
     new DownloaderTask().execute("param");
}