如何在Android应用程序中使用AsyncTask

时间:2013-03-06 09:18:13

标签: android json android-asynctask

我全都陷入AsyncTask,与params相混淆,进展,结果我应该放。在我的应用程序中,我需要显示图像 在画廊里。网址包含所有图片。我通过JSON获取这些图像URL并将响应保存在arraylist中并将其传递给新的 活动。但是,我能够在名为“image_urls”的arraylist中保存JSON响应。作为我刚接触到的android,我很困惑params应该是什么 在背景和asynctask中提供。提前谢谢。

以下是我创建的单独类,在doInBackground中,我使用JSON获取所需的项目。我很困惑所有参数应放在AsyncTask和doInBackground中

public abstract  class Images1 extends AsyncTask<Void, Integer, Void>{
        private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
        private static String url = "http://www.ttt.com/album_pro/array_to_encode";

         ArrayList<String> urlList = new ArrayList<String>();
         JSONParser jParser = new JSONParser();
         ArrayList<String> image_urls = new ArrayList<String>();


         protected ArrayList<String>  doInBackground(Void... params) {
                 JSONObject json = jParser.getJSONFromUrl(url);

                    try{
                JSONObject seo = json.getJSONObject("SEO");
                JSONArray folio = seo.getJSONArray("Folio");

                JSONArray image_urls1 = new JSONArray();
                String s1=seo.getString("Folio");

                                for(int i=0;i<folio.length();++i)
                                {
                            String m = folio.getString(i);
                            Log.v("M"+i,m);
                            image_urls.add(m+ ",");

                                }
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
               return image_urls;
             }

             protected void onProgressUpdate(Integer... progress) {

             }


             protected void onPostExecute(String[] result) {

             }

    }

2 个答案:

答案 0 :(得分:1)

试试这个,

    public class GetTask extends AsyncTask<Void, Void, Integer> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        mPreogressDialog = ProgressDialog.show(Mainactivity.this,
                "Loading", "Please wait");
    }

    @Override
    protected Integer doInBackground(Void... params) {
        // TODO Auto-generated method stub
        //Do your stuff here call ur methods
                    imagedownload();
        return 0;
    }

    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        // TODO Auto-generated method stub
        if (mPreogressDialog.isShowing())
            mPreogressDialog.dismiss();


    }

}

public vlid imagedownload(){
JSONObject json = jParser.getJSONFromUrl(url);

                try{
            JSONObject seo = json.getJSONObject("SEO");
            JSONArray folio = seo.getJSONArray("Folio");

            JSONArray image_urls1 = new JSONArray();
            String s1=seo.getString("Folio");

                            for(int i=0;i<folio.length();++i)
                            {
                        String m = folio.getString(i);
                        Log.v("M"+i,m);
                        image_urls.add(m+ ",");

                            }
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
}

答案 1 :(得分:1)

如果您在http://developer.android.com/reference/android/os/AsyncTask.html上看到他们已经很好地解释了AsyncTask。

但是,如果你没有得到它,让我试一试:

Android通过一个线程修改用户界面,即所谓的 UI线程。如果直接在UI线程上执行长时间运行操作,例如从Internet下载文件,应用程序的用户界面将“冻结”,直到相应的任务完成。

AsyncTask 可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。

为了使用AsyncTask类,您必须扩展它并至少覆盖doInBackground()方法。

您需要实施的最常见方法是:

  1. onPreExecute() - 在线程开始运行之前调用UI线程。此方法通常用于设置任务,例如通过显示进度条。

  2. doInBackground(Params…) - 这是在后台线程上运行的方法。在此方法中,您应该将您希望应用程序在后台执行的所有代码。完成后,它会将结果发送到onPostExecute()。

  3. onProgressUpdate() - 在doInBackground()中调用publishProgress()时调用。

  4. onPostExecute(Result) - 在后台线程完成后调用UI线程。它将从doInBackground()收到的结果作为参数。

  5. AsyncTask是一个通用类,它使用3种类型:AsyncTask<Params, Progress, Result>.

    Params - 输入。您传递给AsyncTask的内容(它可以是从哪里下载文件的URL)

    Progress - 如果您有任何更新,则传递给onProgressUpdate()(如果您想在UI上显示下载过程的进度,则使用此参数)

    Result - 输出。什么将doInBackground()返回给onPostExecute()