【问题标题】:Threaded web service call线程化 Web 服务调用
【发布时间】:2010-09-26 10:53:07
【问题描述】:

我正在从我的 Android 应用程序中的网络服务请求信息。 Web 服务返回一个项目列表,每个项目都有一个 base64 图像和一些信息

第一种方法:只需访问网络服务并获取结果。这意味着在下载数据之前冻结 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 服务逐项下载并立即将其显示在列表中。用户总是可以通过按下按钮来取消请求。

但是,如何做到这一点?还是有别的办法?

【问题讨论】:

    标签: android web-services asynchronous


    【解决方案1】:

    您可以使用 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() 线程

    • 您可以随时取消任务, 来自任何线程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多