【问题标题】:Android Callback ErrorAndroid 回调错误
【发布时间】:2015-01-23 16:26:08
【问题描述】:

我想在ShipInfoManager 中创建一个回调函数来通知MainActivity 执行一些操作。

如果我将onEvent() 放入Runnable,它就会运行。 但是,如果我这样说,它会显示错误。

有没有办法在加载数据后触发回调? 或者,有没有办法像Android的API的LocatioMangerrequestLocationUpdates那样做回调,当数据/变量改变时给出回调?

感谢您的任何回复!

MyCallback 接口

interface MyCallback {
    void callbackCall();
}

ShipInfoManager 类

public class ShipInfoManager {

    Context mContext;

    public ShipInfoManager(Context _mContext) {
        this.mContext = _mContext;

        reloadData();
        startTimer();
    }

    MyCallback callback;

    void onEvent() {
        callback.callbackCall();
    }

    private void startTimer() {
             /* RUN EVERY MIN */
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @SuppressWarnings("unchecked")
                    public void run() {
                        try {
                            reloadData();

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        };
        // TEMP SUSPEND FROM PREVENTING RELOAD //
        timer.schedule(doAsynchronousTask, 0, 5000);

    }

    /* JSON handling and extraction */
    private void reloadData() {
        //Do sth to reload the data

        //After reload, I want to fire the callback
        onEvent();

    }
}

【问题讨论】:

    标签: java android interface callback


    【解决方案1】:

    您的回调似乎没有任何侦听器,并且您没有对此进行检查。

    你应该用这个替换你的ShipInfoManager

    public class ShipInfoManager {
        public interface MyCallback {
            void callbackCall();
        }
    
        public void setCustomEventListener(MyCallback eventListener) {
           callback = eventListener;
        }
    
        Context mContext;
    
        public ShipInfoManager(Context _mContext)  {
            this.mContext = _mContext;
    
            reloadData();
            startTimer();
        }
    
        MyCallback callback;
    
        void onEvent() {
            // Check if we have listeners 
            if (callback != null)
                callback.callbackCall();
        }
    
        private void startTimer() {
             /* RUN EVERY MIN */
            final Handler handler = new Handler();
            Timer timer = new Timer();
            TimerTask doAsynchronousTask = new TimerTask() {
                @Override
                public void run() {
                    handler.post(new Runnable() {
                        @SuppressWarnings("unchecked")
                        public void run() {
                            try {
                                reloadData();
    
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            };
            // TEMP SUSPEND FROM PREVENTING RELOAD //
            timer.schedule(doAsynchronousTask, 0, 5000);
    
        }
    
        /* JSON handling and extraction */
        private void reloadData() {
            //Do sth to reload the data
    
            //After reload, I want to fire the callback
            onEvent();
    
        }
    }
    

    在您的 ActivityFragment 中,您应该有类似的内容:

    public class MainActivity extends ActionBarActivity implements ShipInfoManager.MyCallback {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            ShipInfoManager s = new ShipInfoManager(this);
            s.setCustomEventListener(this);
        }
    
        @Override
        public void callbackCall() {
    
        }
    }
    

    【讨论】:

    • 我修改了和你一样的代码(包括 Activity 中的代码),但 callBack 仍然为空。那么如何在 mainActivity 中创建一个监听器呢?
    • @user3297749 查看我的更新,我已将setCustomEventListener(MyCallback eventListener) 添加到ShipInfoManager 类中,并展示了如何将其连接到您的Activity
    【解决方案2】:

    我这样改变了我的 MainActivity。现在可以了。 谢谢你的建议和回复!!!!!!!

    public class MainActivity extends ActionBarActivity   {
    
    
    ShipInfoManager mShipInfo;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mShipInfo = new ShipInfoManager(this);
    
    
        Log.i("Show Ship List Size", String.valueOf(mShipInfo.get_shipsList().size()));
        Log.i("Show Ship - 6", String.valueOf(mShipInfo.getShip(6).getShip_name()));
    
    
    
        mShipInfo.callback = new ShipInfoManager.MyCallback() {
            @Override
            public void callbackCall() {
                Log.i("Call Back", "it is called");
            }
        };
    
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多