【问题标题】:General AsyncTask, use one AsyncTask in multiple contexts通用 AsyncTask,在多个上下文中使用一个 AsyncTask
【发布时间】:2013-05-10 08:33:06
【问题描述】:

我正在使用 AsyncTask,我发现的所有关于 AsyncTask 的示例都在一个活动中。

我正在尝试制作一个包含大量活动的应用程序,其中一些必须下载 HTML 页面。我真的不想在每个活动中一直复制粘贴相同的代码。我觉得这很脏。

所以我需要将它作为一个特殊的类 Async HttpGet 并使用参数传递函数。我将在 doinbackground 之后执行(每个活动都不同)。

这可能吗,还是我需要在每个活动中复制粘贴我的代码并在后台更改执行以在下载 HTML 页面后执行我需要的操作?

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

这是一个 AsyncTask,它将从 url 下载数据并更新调用活动。

确保您的调用活动实现了接口DownloadDataTask.DownloadCompleteHandler,并将其作为参数传递给DownloadDataTask 构造函数。

public class DownloadDataTask extends AsyncTask<String, Integer, String> {

    public interface DownloadCompleteHandler
    {
        public void handleDownloadComplete(String result);
    }

    private DownloadCompleteHandler handler;
    private String url;

    public DownloadDataTask(DownloadCompleteHandler handler, String url) {
        this.handler = handler;
        this.url = url;
    }


    /* AsyncTask methods */

    @Override
    protected String[] doInBackground(String... empty) {
        return downloadData(url);
    }

    @Override
    protected void onPostExecute(String result) {
        handler.handleDownloadComplete(result);
    }

    /* Downloading Data */

    private String downloadData(String urlStr) {
        InputStream is = null;
        String result = new String();

        try {
            is = getInputStream(urlStr);

            BufferedReader in = new BufferedReader(new InputStreamReader(is));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                result += inputLine;            
        } catch (MalformedURLException ex) {
            return "Malformed URL: " + ex.getMessage();
        } catch (SocketTimeoutException ex) {
            return "Connection timed out";
        } catch (IOException ex) {
            return "IOException: " + ex.getMessage();
        }

        finally {
            if (is != null)
                is.close();
        }

        return result;      
    }

    private InputStream getInputStream(String urlStr) throws IOException 
    {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setReadTimeout(7000);
        conn.setConnectTimeout(7000);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);

        conn.connect();
        return conn.getInputStream();
    }   
}

【讨论】:

    【解决方案2】:

    只需创建一个扩展 AsyncTask 的类,您可以重复使用它。

    public abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    
        private final String url;
    
        public MyAsyncTask(String url){
            this.url = url;
        }
    
        @Override
        protected String doInBackground(Void... params){
            // get data from url.
            return null;
        }
    
    }
    

    然后调用它,只需创建该类的一个实例。

    new MyAsyncTask("http://www.google.com"){
        public void onPostExecute(String result){
            // update your views.
        }
    }.execute();
    

    【讨论】:

    • 我们可以“自定义”或在类定义中直接添加方法吗? :O 我会试试这个
    • 当我们这样做时,新实例使我们实现 doInBackground 方法。为什么?我不希望我在 asynctask 类中这样做
    • 我不得不将 asynctask 类 doinBackground 更改为 @Override protected String doInBackground(Void... params) {
    • 对不起,我是凭记忆写的。已更正。
    【解决方案3】:

    您可以做的是为 AsyncTask 完成创建一个侦听器,该侦听器在您的 AsyncTask 完成时进行侦听并返回数据。我创建了一个示例来在后台线程中执行数据库查询,然后将数据返回给 Activity。只需check it,您就可以为您的问题创建类似的 AsyncTask。

    更新:-

    • 您还可以在 AsyncTask 完成时将 BroadCastReceiver 用作侦听器并返回值。
    • 接口是为 AsyncTask 创建监听器的另一个选项。 这是demo from my github

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多