一般AsyncTask,在多个上下文中使用一个AsyncTask

时间:2013-05-10 08:33:07

标签: android android-asynctask

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

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

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

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

3 个答案:

答案 0 :(得分:3)

只需创建一个扩展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();

答案 1 :(得分:3)

这是一个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 :(得分:2)

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

<强>更新: -

  • 您也可以在AsyncTask完成后使用BroadCastReceiver作为监听器并返回值。
  • Interface是另一个为AsyncTask创建监听器的选项。 这是demo from my github