2015-11-25 3 views
0

У меня есть все мои асинхронные вызовы в их собственных классах, поэтому я не хочу, чтобы глобальные vars были установлены aync'ly. Для этого я хочу вернуть объекты, например, строку из моих методов asprocess после asunc.как вернуть результат от вызова asyn

это можно сделать?

Ниже приведена моя общая структура для моих классов, я хочу вернуть строку, например, из onPostExecute(). Я вижу, что делегаты упоминаются в других местах, но это кажется очень грязным, уверен, что есть способ получить тип возврата к классу или методам?

class GetStuffAsyncly extends AsyncTask<String, String, String> 
{ 
    // my vars.... 

    public myconstructor(String dialogMessage, Context con) 
    { 
     this.qDialog = new ProgressDialog(con); 
     this.dialogString = dialogMessage; 
     this.context = con; 
    } 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     do stuff like fire dialog 
    } 

    @Override 
    protected String doInBackground(String... args) 
    { 
     // do stuff in background... 

     return data; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    protected void onPostExecute(String jsonString) 
    { 
     // dismiss the dialog after getting all data 
     dialog.dismiss(); 
    } 
} 
+2

с обратным вызовом (интерфейсом) является правильным способом – Emil

+0

Thx для ответа Boss. Если возможно, можете ли вы расширить код для демонстрации обратного вызова? – Fearghal

+0

Проверьте ответ на этот вопрос: http://stackoverflow.com/questions/6053602/what-arguments-are-passed-into-asynctaskarg1-arg2-arg3 – karvoynistas

ответ

4

Некоторые вещи, как ниже

class GetStuffAsyncly extends AsyncTask<String, String, String> { 
    String dialogString; 
    ProgressDialog dialog; 
    Context context; 
    AsyncListener listener; 
    // my vars.... 

    public GetStuffAsyncly(String dialogMessage, Context con, AsyncListener listener) { 
     this.dialog = new ProgressDialog(con); 
     this.dialogString = dialogMessage; 
     this.context = con; 
     this.listener = listener; 
    } 

    /** 
    * Before starting background thread Show Progress Dialog 
    */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     listener.onTaskStarted(); 
    } 

    @Override 
    protected String doInBackground(String... args) { 
     // do stuff in background... 

     return data; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    **/ 
    protected void onPostExecute(String jsonString) { 
     // dismiss the dialog after getting all data 
     dialog.dismiss(); 
     listener.onTaskFinished(jsonString); 
    } 
} 

А класс слушателя

public interface AsyncListener { 
    void onTaskStarted(); 

    void onTaskFinished(String data); 
} 

и вы можете назвать, как это

new GetStuffAsyncly(message, this, new AsyncListener() { 
      @Override 
      public void onTaskStarted() { 
       //do your stuff 
      } 

      @Override 
      public void onTaskFinished(String data) { 
//Do your stuff; 
      } 
     }).execute(parameter); 
+0

Great thx. Один вопрос, как я могу использовать класс Listener AsyncListener, я предполагаю, что я назову это из того, что хочу вернуть свои данные, но как я его называю? – Fearghal

+0

Хорошо, я отдам это. Где я могу указать, какой var возвращается из postExecute? Это listener.onTaskFinished (jsonString) ;? – Fearghal

+0

И откуда я извлекаю данные? где вы говорите // делаете ваши вещи? какой var содержит данные из postexecute? моя цель os получить полученные данные от async в мою деятельность - откуда она входит в активность? – Fearghal

0

Другой вариант заключается в использовании AsyncTaskLoader. Вы получаете свой класс не от AsyncTask, а от AsyncTaskLoader. В своей деятельности вам необходимо реализовать интерфейс LoaderCallbacks. Аргсы, которые вы хотите использовать в Loader, вы кладете в Bundle. Вся информация, которую вы хотите получить от Loader, будет передана в методе onLoadFinished(). Вот пример

public class BaseInitLoader extends AsyncTaskLoader<Employee[]> { 
     Context mContext; 
     boolean firstrun; 

     public BaseInitLoader(Context context, Bundle args) { 
      super(context); 
      mContext = context; 
      firstrun = args.getBoolean("firstrun"); 

     } 

     @Override 
     protected void onStartLoading() { 
      super.onStartLoading(); 
      forceLoad(); 
     } 

     @Override 
     public Employee[] loadInBackground() { 
      MainActivity activity =(MainActivity) mContext; 



      Cursor cursor = new DatabaseFiller(activity.getDb(), mContext, firstrun).fillTable(); 
      ArrayList<Employee> list = new ArrayList<>(); 
      QueryResultIterable<Employee> itr = null; 

      try { 

       itr = cupboard().withCursor(cursor).iterate(Employee.class); 
       for(Employee employee: itr){ 
        list.add(employee); 
       } 


      } finally { 
       // close the cursor 
       if (itr != null) { 
        itr.close(); 
       } 
      } 
      Employee[] employees = new Employee[list.size()]; 
      employees = list.toArray(employees); 
      return employees; 
     } 
    } 
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks, View.OnClickListener { 

    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    TextView priority, name, innerPhone, mobilePhone, position; 
    Button cityBtn; 
    CharSequence[] cities; 
    SQLiteDatabase db; 
    Context mContext; 
    private Cursor cursor; 
    private SQLiteDatabase database; 
    private ListView listView; 
    private TextView nameTxt; 
    private EmployeeAdapter adapter; 
    public static final String LOG_TAG = "Database"; 
    SharedPreferences prefs; 
    private boolean firstrun; 
    private ViewPager viewPager; 
    private TabLayout tabLayout; 


    private final int INITIAL = 1; 
    private final int SORT_NAME = 2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mContext = this; 
     Bundle args = new Bundle(); 

     prefs = getSharedPreferences("ua.lanet.PipBoy", MODE_PRIVATE); 
     if(prefs.getBoolean("firstrun", true)){ 
      args.putBoolean("firstrun", true); 
      prefs.edit().putBoolean("firstrun", false).apply(); 

     } 
     else{ 
      args.putBoolean("firstrun", false); 
     } 


     getLoaderManager().initLoader(INITIAL, args, this); 


     PipBoyDataHelper helper = new PipBoyDataHelper(this); 
     db = helper.getWritableDatabase(); 
} 


    public SQLiteDatabase getDb() { 
     return db; 
    } 

    @Override 
    public Loader onCreateLoader(int id, Bundle args) { 

    return new BaseInitLoader(mContext, args); 
    } 

    @Override 
    public void onLoadFinished(Loader loader, Object data) { 

     //do something with the data. Cast Object to your return type of loader 

    } 

    @Override 
    public void onLoaderReset(Loader loader) { 
} 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.text: 
       getLoaderManager().initLoader(SORT_NAME, null, this); 
       break; 
     } 
    } 



    private class ViewPagerAdapter extends FragmentPagerAdapter{ 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 
     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 
    } 

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