如何从asyn调用返回结果

我在他们自己的类中拥有所有异步调用,因此我不希望将全局变量设置为异步。 为此,我想返回对象,例如我的asunc postProcess方法中的字符串。

可以这样做吗?

下面是我的类的一般结构,我想从onPostExecute()返回一个String。 我看到代理在其他地方被提到但是这看起来非常混乱,确定有一种方法可以为类或方法提供返回类型吗?

class GetStuffAsyncly extends AsyncTask { // 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(); } } 

有些事情如下

 class GetStuffAsyncly extends AsyncTask { 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); } } 

和听众class

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

另一种选择是使用AsyncTaskLoader 。 您不是从AsyncTask派生您的类,而是从AsyncTaskLoader派生您的类。 在您的Activity中,您需要实现LoaderCallbacks接口。 你想在Loader中使用的args,你放入Bundle。 您想从Loader获取的所有信息都将通过方法onLoadFinished()传递。 这是一个例子

  public class BaseInitLoader extends AsyncTaskLoader { 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 list = new ArrayList<>(); QueryResultIterable 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 mFragmentList = new ArrayList<>(); private final List 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); } } }