如何从asyn调用

时间:2015-11-25 13:47:13

标签: java android asynchronous

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

可以这样做吗?

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

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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

另一种选择是使用AsyncTaskLoader。您的课程不是来自AsyncTask,而是来自AsyncTaskLoader。在您的Activity中,您需要实现LoaderCallbacks接口。你想在Loader中使用的args,你放入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);
        }
    }

}