2012-02-29 3 views
1

Update 2Создание класса AsyncTask на своем собственном отдельном

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); 
    } 

} 

End Update 2

Update1:

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 

Update:

@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 работать нормально, когда это внутренний класс, whi ch означает в том же 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();    
      } 
    } 
} 
+0

Я бы всегда рассматривал возможность изоляции AsyncTask от Activity как плохой практики повторного факторинга.Ознакомьтесь с моим ответом [здесь] (http://stackoverflow.com/questions/8295003/best-way-to-manage-the-progressdialog-from-asynctask/8317071#8317071), чтобы узнать, как перефакторировать ваш код в более стиль стиля OO. – yorkw

+0

спасибо yorkw для вашего ввода я буду читать далее ... –

ответ

4

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

private Context context; //field in your AsyncTask 

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

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

new taskDoSomething(this).execute(); 

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

EDIT: Cast параметра к классу 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

1+ ... у меня есть код в onPostExecute, что notifDataSetChanged() как бы я позаботился об этом? Я обновил свой вопрос, пожалуйста, посмотрите –

+0

@AbuHamzah Я отредактировал свой ответ. – Luksprog

+0

извините за поздний ответ, но я начал работать над этим сейчас, и я все еще получаю ошибку в 'OnPostExecute', я опубликую logCat –

0

Я реализовал асинхра в отдельном классе в моем один из проект. Я прошел контекст и один интерфейс. Контекст используется для запуска 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); 
     } 
    } 
    } 
+0

У меня есть код в 'onPostExecute', что' notifDataSetChanged() 'i обновил мой вопрос, пожалуйста, посмотрите. –

Смежные вопросы