Создание класса AsyncTask отдельно - PullRequest
1 голос
/ 29 февраля 2012

Обновление 2

Logcat:

03-02 19:03:47.616: E/AndroidRuntime(881): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{TheTask}: java.lang.InstantiationException:  .TheTask
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1569)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.os.Looper.loop(Looper.java:123)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-02 19:03:47.616: E/AndroidRuntime(881):  at java.lang.reflect.Method.invokeNative(Native Method)
03-02 19:03:47.616: E/AndroidRuntime(881):  at java.lang.reflect.Method.invoke(Method.java:507)
03-02 19:03:47.616: E/AndroidRuntime(881):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-02 19:03:47.616: E/AndroidRuntime(881):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-02 19:03:47.616: E/AndroidRuntime(881):  at dalvik.system.NativeStart.main(Native Method)
03-02 19:03:47.616: E/AndroidRuntime(881): Caused by: java.lang.InstantiationException: TheTask
03-02 19:03:47.616: E/AndroidRuntime(881):  at java.lang.Class.newInstanceImpl(Native Method)
03-02 19:03:47.616: E/AndroidRuntime(881):  at java.lang.Class.newInstance(Class.java:1409)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-02 19:03:47.616: E/AndroidRuntime(881):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)

макет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ProgressBar
        android:id="@+id/the_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 <ListView
     android:id="@+id/android:list"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:layout_weight="0.63" />
</LinearLayout>

TestingAsyncTask

//The class that starts the task
public class TestingAsyncTask extends ListActivity {

    private ProgressBar bar = null; 
    private ArrayList<String> data = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.thetask);
        bar = (ProgressBar) findViewById(R.id.the_progress);
        data.add("1");
        data.add("2");
        data.add("3");

        Log.d("create", ""+ data.size());

        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data));
        new TheTask(this).execute((Void) null);     
    }

    public ArrayList<String> getData() {
        return data;
    } 
}

thetask.Асинхронный файл Java

//The AsyncTask class
public class TheTask extends AsyncTask<Void, Void, List<String>> {

    Context c;

    public TheTask(Context c) {
        this.c = c;
    }   

    @Override
    protected void onPreExecute() {
        ((TestingAsyncTask) c).findViewById(R.id.the_progress).setVisibility(View.VISIBLE);
    }



    @Override
    protected List<String> doInBackground(Void... params) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ArrayList<String> res= new ArrayList<String>();
        res.add("a");
        res.add("b");
        res.add("c");
        Log.d("doinbacground", ""+ res.size());
        return res;
    }

    @Override
    protected void onPostExecute(List<String> result) {
        TestingAsyncTask activity = ((TestingAsyncTask) c);
        activity.getData().clear();
        activity.getData().addAll(result);
        ((ArrayAdapter)activity.getListAdapter()).notifyDataSetChanged();
        ((TestingAsyncTask) c).findViewById(R.id.the_progress).setVisibility(View.GONE);
    }

}

Конец обновления 2

Обновление 1:

Description Resource    Path    Location    Type
m_ProgressDialog cannot be resolved GrabUrlAsyncTask.java   
line 81 Java Problem
The field Main.m_orders is not visible   GrabUrlAsyncTask.javaline 79   
Java Problem
The field Main.m_ProgressDialogis not visible   GrabUrlAsyncTask.javaline 
80  Java Problem
The method notifyDataSetChanged() is undefined for the type ListAdapter GrabUrlAsyncTask.java   
line 82 Java Problem

Обновление:

@Override 
        protected void onPostExecute(List<Employee> result) 
        {            
            //showToast("You have to be connected to the internet for this application to work");   
            m_orders.clear();     
            m_orders.addAll(result);   
            progress.dismiss();
            mContext.m_adapter.notifyDataSetChanged();   
        } 

IЯ работал над приложением, и мне удалось заставить AsyncTask нормально работать, когда он является внутренним классом, что означает тот же main.java class, и когда я посмотрел на код, и в него было так трудно попасть, и яЯ планирую провести рефакторинг кода, чтобы у AsyncTask был отдельный отдельный класс.

Я начал это делать, но потом возникло несколько вопросов, например, как мне показать ProgressDialog box or toastText

anbydoy может дать мне направление, пожалуйста?

вот мой код:

public class Main extends ListActivity{

     @Override
     public void onCreate(Bundle savedInstanceState) 
     {
           ............
           .............
           new taskDoSomething().execute();


     } //

     private class taskDoSomething extends AsyncTask<Void, Void, List<Employee>> 
     {
           @Override 
      protected List<Surah> doInBackground(Void... params) 
      {
                //do some stuffs...
                try {
                     ///
                catch (Exception e)
                {
                   //
                }

            } 

            protected void onProgressUpdate(Void... values)
      {
              super.onProgressUpdate(values);         
         m_ProgressDialog.dismiss();  
            } 

            protected void onPostExecute(List<Employee> result)
      {
              m_orders.clear();     
        m_orders.addAll(result);   
        m_ProgressDialog.dismiss();
        m_adapter.notifyDataSetChanged();             
           }  
     } 
}

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Создайте конструктор в вашем AsyncTask, который принимает Context, например:

private Context context; //field in your AsyncTask

public taskDoSomething(Context context) {
    this.context = context;
}

, а затем в вашей деятельности, где вы создаете задачу:

new taskDoSomething(this).execute();

Сейчасв вашем AsyncTask у вас есть Context (который вы можете привести к своей активности), и вы можете использовать этот контекст, чтобы показать, что вы хотите.

РЕДАКТИРОВАТЬ: ПрименитеContext параметр для вашего класса, а затем вы можете получить доступ ко всем полям для этого класса.Например, если ваше m_orders является открытым полем в вашем классе, вы можете получить к нему доступ, как показано ниже, или вы можете создать метод получения / установки для m_orders:

protected void onPostExecute(List<Employee> result) {
         Main activity = (Main) context;
         activity.m_orders.clear();     
         activity.m_orders.addAll(result);   
         m_ProgressDialog.dismiss();
         activity.getListAdapter().notifyDataSetChanged();             
}
0 голосов
/ 29 февраля 2012

Я реализовал асинхронность в отдельном классе в моем проекте.Я прошел контекст и один интерфейс.Контекст используется для запуска ProgressBar, а интерфейс - для выполнения кода в исходном классе.Ниже приведен код.

public class EventAsync {


    public EventAsync(Context ct,EVRequestCallback gt)
    {

    }

      public static abstract class EVRequestCallback {
            public abstract void requestDidFail(ArrayList<EventItem> ei);
            public abstract void requestDidLoad(ArrayList<EventItem> ei);
      }
      public static class RetrieveEventFeeds extends AsyncTask<Void, Void, ArrayList<EventItem>>
    {
          Context mContext;
          private EVRequestCallback mCallback;
        public RetrieveEventFeeds(Context ct,EVRequestCallback gt)
        {
            mContext= ct;
            mCallback=gt;
        }
        private ProgressDialog progress = null;

        @Override
        protected ArrayList<EventItem> doInBackground(Void... params) {

            return retrieveRSSFeed("url",this.mContext);


        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPreExecute() {
            progress = ProgressDialog.show(
                    mContext, null, "Loading ...",true,true);

            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(ArrayList<EventItem> result) {
        //setListAdapter();
            mCallback.requestDidLoad(result);
            progress.dismiss();
            //Toast.makeText(this.mContext, "current done", Toast.LENGTH_SHORT).show();
            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...