2014-11-08 99 views
1

我有一個內部AsyncTask,我從包含此AsyncTask的片段外部的片段調用。我已閱讀並看到一些使用界面的示例。我無法弄清楚如何在我的項目中實現它。從外部調用內部AsyncTask片段

這是我內心的AsyncTask:

public class LoadQueueTask extends AsyncTask<Void, Void, Queue> 
    { 

     @Override 
     protected Queue doInBackground(Void... arg0) { 
      Model model = Model.getInstance(); 
      return model.getQueue(); 

     } 
     @Override 
     protected void onPostExecute(Queue result) { 
      super.onPostExecute(result); 
      queue = result; 
      if(result == null) { 
       listview.setEmptyView(empty); 
       progress.setVisibility(View.GONE); 
       listview.setVisibility(View.VISIBLE);    
       emptyText.setText("Empty Queue"); 
       emptyImage.setImageResource(R.drawable.ic_action_warning); 

      } else { 
       if(result.getSlots().size() != 0) { 
        Handler mHandler = new Handler(); 
        mHandler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          callAsynchronousTask(); 
         } 
        }, 5000); 
       } else { 
        listview.setEmptyView(empty); 
        progress.setVisibility(View.GONE); 
        listview.setVisibility(View.VISIBLE); 
        emptyText.setText("No items found"); 
       } 
      } 
     } 
    } 

這裏是我的片段,我想執行這個任務:

public class Fragment extends SherlockFragment{ 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment, container, false); 
     } 

     ViewPager mViewPager = (ViewPager) rootView.findViewById(R.id.viewPager); 
     kbps = (TextView) rootView.findViewById(R.id.speed); 
     refresh = (ImageView) rootView.findViewById(R.id.refresh); 

     refresh.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       //CALL ASYNCTASK HERE 
      } 
     }); 

     return rootView; 
    } 

回答

0

您可以使用一個去耦消息系統爲EventBusOtto。 第一個片段將成爲發佈者和第二個訂閱者。在後者中,您將啓動AsyncTask。

稍後,您可以在應用程序中的任何位置使用系統,無論何時需要將對象從一個組件發送到另一個組件。

+0

對不起,但我不想使用一個外部庫,只爲任務()。execute(); – Timmeeh93 2014-11-08 23:42:02

0

只需將AsyncTask移動到它自己的公共類中,並且可以從任意位置調用它。有一個回調接口並在您調用AsyncTask的片段中實現該接口。

+0

我希望它作爲一個內部的asynctask保存,否則我必須通過構造函數傳遞大量數據。 – Timmeeh93 2014-11-08 23:34:30

0

創建的片段類

public interface OnFragmentButtonListener{ 
    onMyButtonClicked(); 
} 

現在的界面,讓您的活動舉辦這些片段實現此接口。

在你的OnClick方法,有呼叫

((OnFragmentButtonListener)getActivity()).onMyButtonClicked(); 

下一頁創建片段類中的方法託管的AsyncTask內部類。

public void startAsyncTask(){ 
    new LoadQueueTask.execute(); 
} 

在活動內部,你被迫實現你的接口方法onMyButtonClicked(); 在此方法中,獲取片段的句柄並在片段中調用startAsyncTask方法。