2012-02-29 23 views
1

更新創建的AsyncTask類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

UPDATE1:

​​

更新:

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

我一直工作在一個應用程序,我當它是一個內部類時,我設法讓AsyncTask正常工作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 2012-03-02 01:25:20

+0

感謝yorkw爲您的輸入我會讀更多... – 2012-03-02 01:36:43

回答

4

創建您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一個getter/setter方法:

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()我將如何照顧?我已更新我的問題,請看看 – 2012-02-29 16:34:22

+0

@AbuHamzah我編輯了我的答案。 – Luksprog 2012-02-29 17:04:10

+0

對於遲到的回覆感到抱歉,但我現在開始工作,現在我仍然在'OnPostExecute'上發生錯誤,我將發佈logCat – 2012-03-01 23:35:56

0

我已經實現在不同的類中的異步我一項目。我已經通過了上下文和一個界面。上下文用於啓動ProgressBar,Interface用於執行原始類中的代碼。以下是代碼。

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()''我更新了我的問題,請看一看。 – 2012-02-29 16:17:02