代码之家  ›  专栏  ›  技术社区  ›  Vidar Vestnes

Android的Google Analytics存在问题:“Dispatcher认为它已经完成,但有543个失败事件”[关闭]

  •  1
  • Vidar Vestnes  · 技术社区  · 15 年前

    有人知道如何解决这个问题吗?

        03-23 13:03:20.585: WARN/googleanalytics(3430): Problem with socket or streams.
    03-23 13:03:20.585: WARN/googleanalytics(3430): java.net.SocketException: Broken pipe
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.harmony.luni.platform.OSNetworkSystem.sendStreamImpl(Native Method)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.harmony.luni.platform.OSNetworkSystem.sendStream(OSNetworkSystem.java:498)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:585)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:59)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.http.impl.io.AbstractSessionOutputBuffer.flushBuffer(AbstractSessionOutputBuffer.java:87)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.http.impl.io.AbstractSessionOutputBuffer.flush(AbstractSessionOutputBuffer.java:94)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.http.impl.AbstractHttpClientConnection.doFlush(AbstractHttpClientConnection.java:168)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at org.apache.http.impl.AbstractHttpClientConnection.flush(AbstractHttpClientConnection.java:173)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at com.google.android.apps.analytics.PipelinedRequester.sendRequests(Unknown Source)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.dispatchSomePendingEvents(Unknown Source)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread$AsyncDispatchTask.run(Unknown Source)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at android.os.Handler.handleCallback(Handler.java:587)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at android.os.Handler.dispatchMessage(Handler.java:92)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at android.os.Looper.loop(Looper.java:123)
    03-23 13:03:20.585: WARN/googleanalytics(3430):     at 
    
    android.os.HandlerThread.run(HandlerThread.java:60)
    03-23 13:03:21.088: WARN/googleanalytics(3430): Dispatcher thinks it finished, but there were 543 failed events
    

    特别是最后一行解释了为什么数据会丢失这么多,就像调度员认为的那样,但是有543个事件没有被调度…

    该应用程序具有良好的互联网连接,访问应用服务器端API没有问题。

    我在分析中看到,过去几天的许多初创企业和点击事件都会丢失,即使我知道流量是正常的,因为我可以从服务器API中看到统计数据。

    在分析报告中,我每天都在报告下看到。因此,问题似乎正在扩散/增长到使用此应用程序的所有设备。

    我想知道为什么谷歌不在他们的邮件组里回答这个问题-有几个人抱怨这个…嗯,嗯…

    但是,我仍然不确定是否有什么我能做的来修复它。如果我无能为力去修理它,我想它坏了不是我的错。但我有一种感觉,因为上次部署到Android市场时,问题明显恶化了。

    还有谁在Android的谷歌分析方面有经验?

    1 回复  |  直到 15 年前
        1
  •  5
  •   Vidar Vestnes    15 年前

    问题与TrackEvent和TrackPageView标签中的空白相关。

    1)从所有空格中删除所有空格(或将其退出) trackEvent trackPageView 电话。

    2)清除 google_analytics.db events 表(至少所有行 lable 包含空白的列)

    . . .

    要按代码清除事件行,可以使用以下代码:

    import android.content.Context;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class AnalyticsDB extends SQLiteOpenHelper {
    
        // The Android's default system path of your application database.
        private static String DB_PATH = "/data/data/<YOUR_PACKAGENAME>/databases/";
    
        private static String DB_NAME = "google_analytics";
    
        private SQLiteDatabase myDataBase;
    
        /**
         * Constructor Takes and keeps a reference of the passed context in order to
         * access to the application assets and resources.
         * 
         * @param context
         */
        public AnalyticsDB(Context context) {
            super(context, DB_NAME, null, 1);
        }
    
        public void openDataBase() throws SQLException {
    
            // Open the database
            String myPath = DB_PATH + DB_NAME + ".db";
            myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    
        }
    
        @Override
        public synchronized void close() {
    
            if (myDataBase != null) myDataBase.close();
    
            super.close();
    
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public int deleteEvents() {
            return myDataBase.delete("events", "label LIKE '% %'", null);
        }
    }
    

    并将其添加到启动时的活动中

       public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
                AnalyticsDB myDbHelper = new AnalyticsDB(context);
    
                try {
                    myDbHelper.openDataBase();
                    int deleted = myDbHelper.deleteEvents();
                    myDbHelper.close();
                }
                catch (SQLException sqle) {
                    throw sqle;
                }
                finally{
                    myDbHelper.close();
                }
    
        }
    

    卸载和安装应用程序时,事件表将被删除,但这可能并不总是首选的解决方案。

    所以,如果第1)和第2)点不固定,你的谷歌分析代码将是死肉——永远……

    感谢Jason和Stig B帮助调试

    推荐文章