views:

492

answers:

2

Anyone know how to solve this problem?

    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

Specially the last line explain why there is lost so much data, as the dispatcher thinks it is done, but have 543 events not dispatched...

The application have a good internet connection and there is no problem reaching the app server-side api.

I see in analytics that lots of startups and click-events the past few days are lost, even I know the traffic is normal since i can see statistics from the the server api.

In the analytics reports I see a day by day under-reporting. So the problems seems to be spreading/growing to all the devices using this application.

Im wondering why google does not answer this in their mail-groups - several people have complained about this...well, well...

But, I'm still not sure if there is anything I can do to fix it or not. If there is nothing I can do to fix it, I guess its not my fault that it got broken. But i got a feeling it is, since the problem got dramatically worse on the last deploy to Android market.

Anyone else with experience on Google Analytics for android ?

+1  A: 

The problem is related with whitespaces in trackEvent and trackPageView labels.

1) Remove all whitespaces (or escape them) from all trackEvent and trackPageView calls.

2) Clear the google_analytics.db events table (at least all rows having lable column containing a whitespace)

. . .

To clear the events rows by code you can use the following code:

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);
    }
}

and add it to your activity at startup

   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();
            }

    }

The events table will be deleted when you uninstall and installs the app, but this is probably not always the preferred solution.

So, if point 1) and 2) is not fixed, your Google Analytics code will be dead meat --- forever...

Kudos to Jason and Stig B for helping out debugging

PHP_Jedi
A: 

Hi Jedi

I am having the same issues. I have implemented your tracker = null and checked that the tracker is null when I instantiate it, but am still getting that error

onCreate() {
...
tracker = GoogleAnalyticsTracker.getInstance();
tracker.start("UA-xxxx-yy", this);
tracker.trackEvent("test1", "test2", "test3", 1);
tracker.dispatch();
}

and my onDestroy() looks exactly the same as you have.

Any ideas? Have hit the wall on this one...

Thanks in advance, Neil

Neil
I updated the answer above. I think it should solve the issue.
PHP_Jedi