Android的装载机VS AsyncTask的按钮自来水 [英] Android Loader vs AsyncTask on button tap

查看:74
本文介绍了Android的装载机VS AsyncTask的按钮自来水的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有没有需要从服务器上的数据负载的活动 - 只是简单的init的UI

用户界面有几个按钮。

用户点击其中一个,应用程序发送请求到服务器(REST调用) 而请求正在处理喷丝示出(约10秒)

目前,它使用的AsyncTask - 所以,如果应用程序改变了纵向到横向 - 活动重新启动,我失去的过程

第二个选择是使用装载机 - 问题是,它是启动按钮龙头 - 不是在活动启动

这导致许多例外 - 当LoaderManager将事件发送给非启动项目

有没有什么解决办法吗?

谈几点看法: - 2-10秒只是举例 - 锁用户到一个取向不是一个选项 - 服务是矫枉过正的简单的REST调用

解决方案

 公共类TestActivity扩展FragmentActivity {

    私人按钮之一;
    私人两个按钮;

    私人最终诠释ONE_ID = 0;
    私人最终诠释TWO_ID = 1;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        1 =(按钮)findViewById(R.id.one);
        2 =(按钮)findViewById(R.id.two);

        one.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                getLoaderManager()restartLoader(ONE_ID,空,回调)。
            }
        });

        two.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                getLoaderManager()restartLoader(ONE_ID,空,回调)。
            }
        });

        装载机< AsyncTaskLoaderResult<结果>>装载机= getLoaderManager()getLoader(ONE_ID)。
        如果(装载机!= NULL){
            getLoaderManager()initLoader(ONE_ID,空,回调)。
        }
        装载机= getLoaderManager()getLoader(TWO_ID)。
        如果(装载机!= NULL){
            。getLoaderManager()initLoader(TWO_ID,空,回调);
        }


    }

    公共静态类AsyncTaskLoaderResult< E> {
        公共电子数据;
        公共捆绑ARGS;
    }

    公共静态类结果{

    }

    私人LoaderManager.LoaderCallbacks< AsyncTaskLoaderResult<结果>>回调=新LoaderManager.LoaderCallbacks< AsyncTaskLoaderResult<结果>>(){
        @覆盖
        公共装载机< AsyncTaskLoaderResult<结果>> onCreateLoader(INT ID,捆绑参数){
            / **
             *根据不同的ID,创造出不同的AsyncTaskLoader
             * /
            开关(ID){
                案例ONE_ID:
                    返回新OneAsyncTaskLoader(TestActivity.this);
                案例TWO_ID:
                    返回新TwoAsyncTaskLoader(TestActivity.this);
            }
            返回null;
        }

        @覆盖
        公共无效onLoadFinished(装载机< AsyncTaskLoaderResult<结果>>装载机,AsyncTaskLoaderResult<结果>数据){
            / **
             *处理结果
             * /
            开关(loader.getId()){

            }

            。getLoaderManager()destroyLoader(loader.getId());
        }

        @覆盖
        公共无效onLoaderReset(装载机< AsyncTaskLoaderResult<结果>>装载机){

        }
    };

    公共静态类OneAsyncTaskLoader扩展AsyncTaskLoader< AsyncTaskLoaderResult<结果>> {

        私人AsyncTaskLoaderResult<结果>结果;

        公共OneAsyncTaskLoader(上下文的背景下){
            超(上下文);
        }

        @覆盖
        保护无效onStartLoading(){
            super.onStartLoading();
            如果(结果!= NULL){
                deliverResult(结果);
            } 其他 {
                的forceload();
            }
        }

        @覆盖
        公共AsyncTaskLoaderResult<结果> loadInBackground(){
            / **
             *发送请求到服务器
             * /
            结果=新AsyncTaskLoaderResult<结果>();
            result.data = NULL; // result.data来自服务器的响应
            返回结果;
        }
    }

    公共静态类TwoAsyncTaskLoader扩展AsyncTaskLoader< AsyncTaskLoaderResult<结果>> {


        私人AsyncTaskLoaderResult<结果>结果;

        公共TwoAsyncTaskLoader(上下文的背景下){
            超(上下文);
        }

        @覆盖
        保护无效onStartLoading(){
            super.onStartLoading();
            如果(结果!= NULL){
                deliverResult(结果);
            } 其他 {
                的forceload();
            }
        }

        @覆盖
        公共AsyncTaskLoaderResult<结果> loadInBackground(){
            / **
             *发送请求到服务器
             * /
            结果=新AsyncTaskLoaderResult<结果>();
            result.data = NULL; // result.data来自服务器的响应
            返回结果;
        }
    }
}
 

I have an activity which requires no data from server on load - just plain init for ui

UI has several buttons.

User clicks one of them and app sends request to server (rest call) While request is processing spinner is shown (for about 10 seconds)

For now it uses AsyncTask - so if app changes portrait to landscape - activity is restarted and I loose the process

Second option is to use Loader - the problem is that it is started on button tap - not on activity start

This leads to many exceptions - when LoaderManager sends events to non-started item

Is there any solution?

few comments: - 10 seconds is just for example - lock user to one orientation is not an option - service is overkill for simple rest call

解决方案

public class TestActivity extends FragmentActivity {

    private Button one;
    private Button two;

    private final int ONE_ID = 0;
    private final int TWO_ID = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        one = (Button) findViewById(R.id.one);
        two = (Button) findViewById(R.id.two);

        one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getLoaderManager().restartLoader(ONE_ID, null, callbacks);
            }
        });

        two.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getLoaderManager().restartLoader(ONE_ID, null, callbacks);
            }
        });

        Loader<AsyncTaskLoaderResult<Result>> loader = getLoaderManager().getLoader(ONE_ID);
        if (loader != null) {
            getLoaderManager().initLoader(ONE_ID, null, callbacks);
        }
        loader = getLoaderManager().getLoader(TWO_ID);
        if (loader != null) {
            getLoaderManager().initLoader(TWO_ID, null, callbacks);
        }


    }

    public static class AsyncTaskLoaderResult<E> {
        public E data;
        public Bundle args;
    }

    public static class Result {

    }

    private LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<Result>> callbacks = new LoaderManager.LoaderCallbacks<AsyncTaskLoaderResult<Result>>() {
        @Override
        public Loader<AsyncTaskLoaderResult<Result>> onCreateLoader(int id, Bundle args) {
            /**
             * according different Id, create different AsyncTaskLoader
             */
            switch (id) {
                case ONE_ID:
                    return new OneAsyncTaskLoader(TestActivity.this);
                case TWO_ID:
                    return new TwoAsyncTaskLoader(TestActivity.this);
            }
            return null;
        }

        @Override
        public void onLoadFinished(Loader<AsyncTaskLoaderResult<Result>> loader, AsyncTaskLoaderResult<Result> data) {
            /**
             * handle result
             */
            switch (loader.getId()) {

            }

            getLoaderManager().destroyLoader(loader.getId());
        }

        @Override
        public void onLoaderReset(Loader<AsyncTaskLoaderResult<Result>> loader) {

        }
    };

    public static class OneAsyncTaskLoader extends AsyncTaskLoader<AsyncTaskLoaderResult<Result>> {

        private AsyncTaskLoaderResult<Result> result;

        public OneAsyncTaskLoader(Context context) {
            super(context);
        }

        @Override
        protected void onStartLoading() {
            super.onStartLoading();
            if (result != null) {
                deliverResult(result);
            } else {
                forceLoad();
            }
        }

        @Override
        public AsyncTaskLoaderResult<Result> loadInBackground() {
            /**
             * send request to server
             */
            result = new AsyncTaskLoaderResult<Result>();
            result.data = null; //  result.data comes from server's response
            return result;
        }
    }

    public static class TwoAsyncTaskLoader extends AsyncTaskLoader<AsyncTaskLoaderResult<Result>> {


        private AsyncTaskLoaderResult<Result> result;

        public TwoAsyncTaskLoader(Context context) {
            super(context);
        }

        @Override
        protected void onStartLoading() {
            super.onStartLoading();
            if (result != null) {
                deliverResult(result);
            } else {
                forceLoad();
            }
        }

        @Override
        public AsyncTaskLoaderResult<Result> loadInBackground() {
            /**
             * send request to server
             */
            result = new AsyncTaskLoaderResult<Result>();
            result.data = null; //  result.data comes from server's response
            return result;
        }
    }
}

这篇关于Android的装载机VS AsyncTask的按钮自来水的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆