【问题标题】:Implement interface inside Asynctask在 Asynctask 中实现接口
【发布时间】:2016-07-03 05:47:35
【问题描述】:

我不想像这样直接在 asynctask 类中实现接口:

new AsyncTask<Void, Void, Void>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                swipeRefreshLayout.setRefreshing(true);
            }

            @Override
            protected Void doInBackground(Void... params) {
                retrofitCallBackUtil.getLastTenMessageCallBack(AppConfig.USER_ID, userId, offsetNumber, service, new RetrofitResponseCallBack() {
                    @Override
                    public void onSuccess(ArrayList<Message> messages) {
                        messageAdapter.insertToTheFirst(messages);
                    }

                    @Override
                    public void onFailure() {

                    }
                });
                offsetNumber += 5;
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                messageAdapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);
            }
        }.execute();

我只是通过主类实现它并将 this 放入此参数中,如下所示:

retrofitCallBackUtil.getLastTenMessageCallBack(AppConfig.USER_ID, userId, offsetNumber, service, this);

但我不能在 asynctask 方法中做到这一点。那么有人可以给我一些解决方案吗?

【问题讨论】:

    标签: android interface android-asynctask


    【解决方案1】:

    我假设您在 MainActivity(或类似的东西)中有这些代码。

    让我们通过implements RetrofitResponseCallBack {...}实现你需要在这个Activity中传入getLastTenMessageCallBack的接口

    现在,在您的 Asyntask doInBackground 方法中,调用

    retrofitCallBackUtil.getLastTenMessageCallBack(AppConfig.USER_ID, userId, offsetNumber, service, MainActivity.this)
    

    瞧,您不必再在 Asyntask 中创建匿名类了。 请注意,您必须正确移动和放置fields/params,只是正确放置的问题,没什么大不了的:D

    【讨论】:

    • 实际上,我想要的只是通过 ChatActivity.this 进入该方法并运行:D
    【解决方案2】:

    像这样为AsyncTask 单独创建一个类。
    此AsyncTask 将处理数据并发布实现interface 在AsyncTask 中定义的数据。
    在这种情况下,定义的接口是 DataDownloadListener

    public class GetFoldersAsync extends AsyncTask<Integer,Boolean,Boolean> {
        Context context;
        ProgressDialog dialog;
        ArrayList mFolderDataLevel;
    
        public GetFoldersAsync(Context context){
            this.context=context;
    
        }
        public static interface DataDownloadListener {
            public void dataDownloadedSuccessfully(ArrayList data);
            public void dataDownloadFailed();
        }
        DataDownloadListener dataDownloadListener;
        public void setDataDownloadListener(DataDownloadListener dataDownloadListener) {
            this.dataDownloadListener = dataDownloadListener;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(context, "Please wait", "Processing.........");
        }
        @Override
        protected Boolean doInBackground(Integer... params) {
            Log.v(Constants.BLL_LOG, "ExplorerDBOperation doInBackground  ");
    
            mFolderDataLevel=new ArrayList();
    
            // Process to populate mFolderDataLevel
    
            return true;
        }
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if(dialog!=null && dialog.isShowing())
            {dialog.dismiss();}
            Log.v(Constants.BLL_LOG, "ExplorerDBOperation onPostExecute  ");
            if(mFolderDataLevel!=null && mFolderDataLevel.size()>0){
                dataDownloadListener.dataDownloadedSuccessfully(mFolderDataLevel);
            }else{
                dataDownloadListener.dataDownloadFailed();
            }
        }
    }
    

    现在在调用者 Activity 中,当 AsyncTask 需要处理并取回数据给同一个 Activity 时调用此方法。

    public class HomeActivity extends AppCompatActivity {
    
        //Other necessary methods goes here .....
    
        //call this method for processing AsyncTask and to get back data 
        public void getFolderData(int parentID, int callerID){
                Log.v(Constants.BLL_LOG,"parentID="+parentID+" , callerID="+callerID);
                mCallerID=callerID;
                GetFoldersAsync getFolders = new GetFoldersAsync(this);
                getFolders.setDataDownloadListener(new GetFoldersAsync.DataDownloadListener()
                {
                    @SuppressWarnings("unchecked")
                    @Override
                    public void dataDownloadedSuccessfully(ArrayList data) {
                        Log.v(Constants.BLL_LOG,"getFolderData dataProcessSuccessfully");
    
                        // Success data with populated ArrayList to process further
    
                    }
                    @Override
                    public void dataDownloadFailed() {
                        //Failure
                        Log.v(Constants.BLL_LOG,"getFolderData dataProcessFailed()");
                    }
                });
            getFolders.execute(callerID);
        }
    }
    

    【讨论】:

    • 感谢您的回答,但我的问题并没有那么复杂。只需通过 NameOfMyClass.this 进入该参数即可解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-12-23
    • 2014-04-20
    相关资源
    最近更新 更多