【问题标题】:Android XMLRPC Exception handlingAndroid XMLRPC 异常处理
【发布时间】:2014-03-13 11:59:37
【问题描述】:

我想问一下,当您调用 XMLRPC 函数并且服务器已关闭或没有响应时,处理异常的最佳方法是什么。我有以下代码:

try
    {           
        mXmlRpcClient.call(mRequestVariantsFunc, SessionID, newID, "1970-01-01T00:00:00+00" ,"1970-01-01T00:00:00+00");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

上面的代码在服务器运行时工作正常,但是当它关​​闭时,我得到一个黑屏并且手机死机。其余代码在黑屏时运行,但未引发异常。如果服务器关闭而不进入黑屏,有没有办法处理这个问题?

【问题讨论】:

    标签: android exception xml-rpc


    【解决方案1】:

    对我来说,在另一个工具中,有一条消息通过处理程序来指示进度。此外,有一个单独的类来处理异常也很不错。

    如果你和我有同样的图书馆,这里是我的例子:

    package hha.zhongcan.communication;
    
    import java.net.URI;
    
    import android.os.Handler;
    
    import android.util.Log;
    import hha.zhongcan.framework.Citem;
    import hha.zhongcan.framework.Configuration;
    import hha.zhongcan.framework.CtimeFrame;
    import hha.zhongcan.framework.Ctransaction;
    import hha.zhongcan.microfood.AskTableDialog;
    import hha.zhongcan.resources.Global;
    import org.apache.http.conn.HttpHostConnectException;
    
    interface XMLRPCMethodCallback 
    {
        void callFinished(Object result);
    }
    
    /** Messages to send to the PC at high level. Receive the menu items, pages, transactions.
     *  Create fake data for the demo.
     *  
     * @author mensfort
     *
     */
    public class Cmessage
    {
        static private Cmessage     m_message =null;
        private static URI          m_uri;
        public static XMLRPCClient  m_client;
        private final static String TAG="message";
        private boolean             m_connected =false;
        private int m_pingId =0;
        private int m_lost =0;
        private int m_wait =0;
        private boolean m_sendTransactions =true;
        private Handler m_updateHandler = new Handler(); 
        boolean m_getItems = false;
        boolean m_getPages = false;
        private static Global m_global =null;
        private int m_countTransactions =10;
        private int transactionMessageCount =0;
        private long getValue( String s)
        {
            try
            {
                if ( s.startsWith("0x") || s.startsWith("0X"))
                {
                    s =s.substring(2);
                    while (s.startsWith("0"))
                    {
                        s=s.substring(1);
                    }
                    if ( s.length() ==0)
                    {
                        return 0;
                    }
                    return Long.parseLong(s, 16);  
                }
                if ( s=="")
                {
                    return 0;
                }
                return Long.parseLong(s);
            }
            catch(Exception e)
            {
                e.printStackTrace();
                return 0;
            }
        }
    
        /// @brief New thread for running ask-table.
        private Runnable messageTask = new Runnable() 
        {
            //@override
            public void run() 
            {
                if ( m_getItems)
                {
                    m_getItems =false;
                    getMenuItems();
                }
                else if ( m_getPages)
                {
                    m_getPages =false;
                    getMenuPages();
                }
                else if ( m_sendTransactions)
                {
                    // If I have sth to send and I'm not in page mode, then start sending items.
                    sendTransactions();
                    m_wait =2;
                }
                else if ( Configuration.getInstance().isDemo())
                {
                    m_connected =true;
                    next();
                }
                else if ( m_wait>0)
                {
                    m_wait--;
                    next();
                }
                else if ( --m_countTransactions<=0)
                {
                     sendMessage_getTransactions();
                     m_countTransactions =5;
                }
                else
                {
                     // Update this screen every 10 seconds.
                     sendConnected();
                }           
            }
        };  
    
        /** @brief At startup start the first message after a second.
         */
        private Cmessage()
        {
            m_updateHandler.postDelayed( messageTask, 1000);
        }
    
        /** @brief Set the address and port.
         * 
         * @param address [in] Address to use.
         * @param port [in] Port to use.
         */
        public void setPath( String address, Integer port)
        {
            m_uri = URI.create("http://192.168.0.105:9876");
            m_client  =new XMLRPCClient( m_uri); 
        }
    
        /** @brief Singleton implementation, only this instance can send messages.
         * 
         * @return Pointer to the singleton.
         */
        public static Cmessage getInstance()
        {
            if ( m_message ==null)
            {
                m_message =new Cmessage();
                m_global  =Global.getInstance();
            }
            return m_message;
        }
    
        /** @brief In a second, the next command can be send to the PC.
         */
        public void next()
        {
            m_updateHandler.postDelayed( messageTask, 1000);
        }
    
        /** @brief Check if we are connected to the PC. 
         * 
         * @return true when connected.
         */
        public boolean isConnected()
        {
            return m_connected;
        }
    
        /** @brief Send Ping message, just to check the connection status. 
         */
        public void sendConnected()
        {
            {
                XMLRPCMethod method =new XMLRPCMethod( "ping", new XMLRPCMethodCallback() {
                    public void callFinished(Object result) 
                    {
                        try 
                        {
                            String s = (String) (result);
                            if ( s.equals("bart"))
                            {
                                m_lost =0;
                                m_connected =true;
                            }
                        } 
                        catch (Exception e) 
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                            m_connected =false;
                            m_lost++;
                        }
                    }
                });
                Object[] params ={ m_pingId++ }; // {};
                method.call(params);
            }
            if ( ++m_lost>2)
            {
                m_connected =false;
            }
        }
    
        public void sendMessage_getConfiguration() 
        {
            // TODO Auto-generated method stub      
        }
    
        private void createMenuFrom( Object [] arrY)
        {
            if ( arrY.length >0)
            {
                m_global.itemDB.clean();
            }
            int v=(int)(arrY.length/9);
            int lvl=1;
            for (int y=0; y<arrY.length; y++)  
            {
                if ( y==lvl*v)
                {
                    setSlider(lvl++);
                }
                Log.i(TAG, "item " + y);
                Object[] arrX = (Object[]) arrY[y];
                int id =(Integer) arrX[0];
                String alias =(String) arrX[1];
                String local =(String) arrX[2];                         
                String chinese =(String) arrX[3];
                int restaurant_price =(Integer) arrX[4];
                int takeaway_price =(Integer) arrX[5];
                int level =(Integer) arrX[6];
                int page =(Integer) arrX[7];
                int sequence =(Integer) arrX[8];
                int colour_text = (int)(getValue( (String) arrX[9])&0xffffffff);
                int colour_background = (int)(getValue( (String) arrX[10])&0xffffffff);
                int colour_selected_text = (int)(getValue( (String) arrX[11])&0xffffffff);
                int colour_selected_background = (int)(getValue( (String) arrX[12])&0xffffffff);
                int colour_background2 = (int)(getValue( (String) arrX[13])&0xffffffff);
                int colour_selected_background2 = (int)(getValue( (String) arrX[14])&0xffffffff);
                if ( m_global.mainMenuHandler !=null)
                {
        //                  m_global.mainMenuHandler.obtainMessage( y, "UPDATE_MENU_SLIDEBAR "+y).sendToTarget();
    
                }
                m_global.itemDB.insert( id, alias, local, chinese, restaurant_price, 
                                      takeaway_price, (byte)level, (byte)page, (short)sequence, 
                                      colour_text, colour_background, colour_selected_text, 
                                      colour_selected_background, colour_background2, 
                                      colour_selected_background2);
            }
            m_global.itemDB.complete();
            Log.i(TAG, "Items received correct.");
        }
    
        /** Indicate that we want to get the menu card.
         */
        public void sendMessage_getMenuItems() 
        {
            m_getItems = true;
            m_getPages = true;
        }
    
        /** @brief Get the menu items. */
        public void getMenuItems() 
        {
            boolean demo =Configuration.getInstance().isDemo();
            if (demo ==true)
            {
                createMenuFrom( demoMenu.items);        
                next();
            }
            else
            {
                XMLRPCMethod method =new XMLRPCMethod( "items", new XMLRPCMethodCallback() {
                    public void callFinished(Object result) 
                    {
                        try 
                        {
                            m_global.itemDB.deleteAll();
                            m_global.itemDB.clean();
                            Object[] arrY = (Object[]) result;
                            createMenuFrom( arrY);
                            m_connected =true;
                        } 
                        catch (Exception e) 
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                            m_connected =false;
                        }
                    }
                });
                Object[] params = {};
                if ( m_global.mainMenuHandler !=null)
                {
                    m_global.mainMenuHandler.obtainMessage( 1, "UPDATE_MENU_SLIDEBAR 1").sendToTarget();
                }
                method.call(params);
                if ( m_global.mainMenuHandler !=null)
                {
                    m_global.mainMenuHandler.obtainMessage( 1, "UPDATE_MENU_SLIDEBAR 5").sendToTarget();
                }
            }
        }
    
        /** Call to get all transactions from the server, including payments, items and time-frames. */
        public void sendMessage_sendTransactions() 
        {
            m_sendTransactions =true;
        }
    
        /** Set slider to a value 1..10 
         * 
         * @param n [in] 0..10
         */
        private void setSlider( int n)
        {
            if ( m_global.mainMenuHandler !=null)
            {
                m_global.mainMenuHandler.obtainMessage( 0, "UPDATE_MENU_SLIDEBAR "+n).sendToTarget();
            }
        }
    
        /** After sending the orders, the database can be cleaned...
         */
        private void cleanDatabase()
        {
            try 
            {
                m_global.transactionDB.clean();
                m_global.timeFrameDB.clean();
                m_global.transactionItemDB.clean();
                m_connected =true;
            } 
            catch (Exception e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                m_connected =false;
            }
        }
    
        /** Send all transaction */
        private void sendTransactions()
        {
            if ( m_global.transactionDB.size() ==0)
            {
                m_sendTransactions =false;
                cleanDatabase();
                next();
                return;
            }
            if ( Configuration.getInstance().isDemo())
            {
                cleanDatabase();
                try
                {
                    m_global.askTableHandler.obtainMessage( AskTableDialog.MESSAGE_DATA_SENT,-1,-1, -1).sendToTarget();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                m_sendTransactions =false;
            }
            XMLRPCMethod method =new XMLRPCMethod( "orders", new XMLRPCMethodCallback() 
            {
                public void callFinished(Object result) 
                {
                    cleanDatabase();
                    m_global.askTableHandler.obtainMessage( AskTableDialog.MESSAGE_DATA_SENT,-1,-1, -1).sendToTarget();
                    m_sendTransactions =false;
                }
            });
            Object[][] transaction =m_global.transactionDB.get();
            Object[][] timeFrame   =m_global.timeFrameDB.get();
            Object[][] item        =m_global.transactionItemDB.get();
    
            Object[] params ={ transaction,timeFrame,item };
    
            //{
            //  transaction, timeFrame, item
            //}/;
            if ( transaction ==null || timeFrame ==null || item ==null)
            {
                cleanDatabase();
                Log.e( TAG,"Database problem!!");
            }
            method.call( params);
        }
    
        /// Call to get all transactions from the server, including payments, items and time-frames.
        public void sendMessage_getTransactions() 
        {
            if ( m_global.transactionDB.size() >0)
            {
                return;
            }
            if ( m_global.timeFrameDB.size() >0)
            {
                return;
            }
            if ( m_global.transactionItemDB.size() >0)
            {
                return;
            }
            XMLRPCMethod method =new XMLRPCMethod( "get_transactions", new XMLRPCMethodCallback() 
            {
                public void callFinished(Object result) 
                {
                    m_countTransactions =10;
                    m_connected =true;
                    if ( m_global.transactionDB.size() >0)
                    {
                        Log.i(TAG, "Transaction DB not empty.");
                        return;
                    }
                    if ( m_global.timeFrameDB.size() >0)
                    {
                        Log.i(TAG, "Time Frame DB not empty.");
                        return;
                    }
                    if ( m_global.transactionItemDB.size() >0)
                    {
                        Log.i(TAG, "Transaction Item DB not empty.");
                        return;
                    }
                    try 
                    {
                        m_global.transactionList.clean();               
                        Object[] arrY = (Object[]) result;
                        Object[] transactions =(Object[]) arrY[0];
                        Object[] timeFrames   =(Object[]) arrY[1];
                        Object[] items        =(Object[]) arrY[2];
                        //Object[] payments     =(Object[]) arrY[3];
    
                        for (int y=0; y<transactions.length; y++) 
                        {
                            Object[] trx = (Object[]) transactions[y];
                            int id = Integer.valueOf(trx[0].toString());
                            String tme =trx[1].toString();
                            String name =trx[2].toString();
                            int customer_id =Integer.valueOf( trx[3].toString());
                            int status =Integer.valueOf( trx[4].toString());
                            int total =Integer.valueOf( trx[5].toString());
                            Ctransaction t=new Ctransaction( id, name, tme, status, customer_id, total);
                            m_global.transactionList.insert( t);
                        }
                        for (int y=0; y<timeFrames.length; y++) 
                        {
                            Object[] trx = (Object[]) timeFrames[y];
                            int id = Integer.valueOf( trx[0].toString());
                            int tfi =Integer.valueOf( trx[1].toString());
                            int waiter =Integer.valueOf( trx[2].toString());
                            String start_time =trx[3].toString();
                            String end_time =trx[4].toString();
                            int transaction_id =Integer.valueOf( trx[5].toString());
                            int device_id =Integer.valueOf( trx[6].toString());
                            CtimeFrame c =new CtimeFrame( id, (short)tfi, waiter, 
                                                          start_time, end_time, 
                                                          transaction_id, device_id);
                            m_global.transactionList.insert( c);
                        }
                        for (int y=0; y<items.length; y++) 
                        {
                            Object[] trx = (Object[]) items[y];
                            //int id = (Integer) trx[0];
                            long menu_item_id =Long.valueOf( trx[1].toString());
                            int sequence =Integer.valueOf( trx[2].toString());
                            int time_frame_index =Integer.valueOf( trx[3].toString());
                            int deleted_time_frame_index =Integer.valueOf( trx[4].toString());
                            long transaction_id =Long.valueOf( trx[5].toString());
                            int quantity =Integer.valueOf( trx[6].toString());
                            int level =Integer.valueOf( trx[7].toString());
                            int deleted =Integer.valueOf( trx[8].toString());
                            int portion =Integer.valueOf( trx[9].toString());
                            int orig_price =Integer.valueOf( trx[10].toString());
                            int unit_price =Integer.valueOf( trx[11].toString());
                            String time =trx[12].toString();                    
                            Citem i=new Citem( menu_item_id, y, (short)sequence, 
                                               (short)time_frame_index, 
                                               (short)deleted_time_frame_index,
                                               transaction_id, quantity, 
                                               (byte)level, deleted, (byte)portion, unit_price, orig_price, time);
                            m_global.transactionList.insert( i);
                        }
                        //for (int y=0; y<payments.length; y++) 
                        //{
                            //Object[] pay = (Object[]) payments[y];
                            //int id = (Integer) pay[0];
                            //String time =(String) pay[1];
                            //int money_received =(Integer) pay[2];
                            //int customer_id =(Integer) pay[3];
                            //int pay_method =(Integer) pay[4];
                            //int partial_index =(Integer) pay[5];
                            //global.paymentsDB.insert( id, time, money_received, customer_id, pay_method, partial_index);
                        //}
                    } 
                    catch (Exception e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        m_connected =false;
                    }
                }
            });
            Object[] params = { transactionMessageCount++ };
            method.call(params);
        }
    
        /// Call, but not in main thread, answer comes in a thread.
        private void getMenuPages() 
        {
            if ( Configuration.getInstance().isDemo())
            {
                decodePages( demoMenu.pages);
                next();
                return;
            }
            XMLRPCMethod method =new XMLRPCMethod( "pages", new XMLRPCMethodCallback() 
            {
                public void callFinished(Object result) 
                {
                    decodePages( result);
                }
            });
            setSlider(7);
            Object[] params = {};
            method.call(params);
            setSlider(8);
        }
    
        /**  
         * @brief Convert an array to page data. 
         * @param result [in] array with local, chinese names.
         */
        private void decodePages( Object result)
        {
            try 
            {
                m_global.pageDB.clean();
                Object[] arrY = (Object[]) result;
                setSlider(9);
                for (int y=0; y<arrY.length; y++) 
                {
                    Object[] arrX = (Object[]) arrY[y];
                    int id = (Integer) arrX[0];
                    String local =(String) arrX[1];
                    String chinese =(String) arrX[2];
                    String lc =local.replace( "'", "''");
                    String ch =chinese.replace( "'", "''");
                    m_global.pageDB.insert( id, lc, ch);
                }
                m_connected =true;
                if ( m_global.mainMenuHandler !=null)
                {
                    m_global.mainMenuHandler.obtainMessage( 0, "UPDATE_MENU_READY").sendToTarget();
                }
            } 
            catch (Exception e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                m_connected =false;
            }
        }
    
        class XMLRPCMethod extends Thread 
        {
            private String method;
            private Object[] params;
            private Handler handler;
            private XMLRPCMethodCallback callBack;
            public XMLRPCMethod(String method, XMLRPCMethodCallback callBack) 
            {
                this.method = method;
                this.callBack = callBack;
                handler = new Handler();
            }
            public void call() 
            {
                call(null);
            }
            public void call(Object[] params) 
            {
                this.params = params;
                start();
            }
            //@Override
            public void run() 
            {
                 synchronized(this) 
                 {
                    try 
                    {
                        final long t0 = System.currentTimeMillis();
                        final Object result = m_client.callEx(method, params);
                        final long t1 = System.currentTimeMillis();
                        handler.post(new Runnable() 
                        {
                            public void run() 
                            {
                                Log.i(TAG, "XML-RPC call took " + (t1-t0) + "ms");
                                callBack.callFinished(result);
                                next();
                            }
                        });
                    } 
                    catch (final XMLRPCFault e) 
                    {
                        handler.post(new Runnable() 
                        {
                            public void run() 
                            {
                                Log.e(TAG, "Fault message: " + e.getFaultString() + "\nFault code: " + e.getFaultCode());
                                Log.d("Test", "error", e);
                                next();
                            }
                        });
                    } 
                    catch (final XMLRPCException e) 
                    {
                        next();
                        handler.post(new Runnable() 
                        {
                            public void run() 
                            {
                                Throwable couse = e.getCause();
                                if (couse instanceof HttpHostConnectException) 
                                {
                                    Log.e(TAG, "Cannot connect to " + m_uri.getHost() + "\nMake sure server.py on your development host is running !!!");
                                } 
                                else 
                                {
                                    Log.e(TAG, "Error " + e.getMessage());
                                }
                                Log.d(TAG, "error", e);
                            }
                        });
                    }
                    catch (Exception e)
                    {
                        next();
                        e.printStackTrace();
                    }
                 }
             }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2019-10-17
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多