0
votes

I am trying out the Cloudboost Java Sdk in Android Studio and have hit a snag that I hope someone can help me with. I think I have the project set up properly but the Logcat tells me other wise. I have included snippets of all of the involved file for your review. Thanks

First, here is the logcat error:

FATAL EXCEPTION: main Process: main.dozer74.cloudboosttest, PID: 18357 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:5198) at android.view.View$PerformClick.run(View.java:21147) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:5198)  at android.view.View$PerformClick.run(View.java:21147)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) at java.net.InetAddress.lookupHostByName(InetAddress.java:431) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) at java.net.InetAddress.getAllByName(InetAddress.java:215) at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java) at io.cloudboost.util.CBParser.callJson(CBParser.java:69) at io.cloudboost.CloudQuery.find(CloudQuery.java:1408) at main.dozer74.cloudboosttest.MainActivity.getTroopsFromDatabase(MainActivity.java:27) at java.lang.reflect.Method.invoke(Native Method)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  at android.view.View.performClick(View.java:5198)  at android.view.View$PerformClick.run(View.java:21147)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

 

The app is very simple; just a button that performs a query

Button xml code

    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Get Troops From Database"
    android:id="@+id/button"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentEnd="true"
    android:onClick="getTroopsFromDatabase"/>

Java code for the button:

public void getTroopsFromDatabase(View view) {
    //Log.d("dozer74", "Get troops from database");

    CloudQuery query = new CloudQuery("Messages");
    try {
        query.find(new CloudObjectArrayCallback(){
            @Override
            public void done(CloudObject[] x, CloudException t) {
                if(x != null){
                    Log.d("dozer74", "====>>>> x is not equal to null");
                } else {
                    Log.d("dozer74", "====>>>> x is equal to null");
                }

                if(t != null){
                    Log.d("dozer74", "====>>>> t is not equal to null");
                } else {
                    Log.d("dozer74", "====>>>> t is equal to null");
                }
            }
        });
    } catch (CloudException e) {
        e.printStackTrace();
    }
}

Here is my manifest with references a class called Application where my Cloudboost init occurs

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="main.dozer74.cloudboosttest">

    <application
        android:name=".Application"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Finally, here is the code from the Application.class with the App Id and Master Key "X"ed out for obvious reasons in addition to the code added to my build.gradle where I am getting the sdk into the project.

Application.class

public class Application extends android.app.Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Init your Application
        CloudApp.init("xxxxxxxxxxxx", "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
    }
}

build.gradle snippet

repositories {
    maven {
        url 'https://docs.cloudboost.io/java.html'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'io.cloudboost:JavaSDK:1.0.3'
}
1

1 Answers

0
votes

The problem is that you are executing a network call on UI thread which is against what android recommends. Do this instead:

class Query extends AsyncTask<Void, Void, Void> {
  @Override
  protected String doInBackground(String... args) {
    CloudQuery query = new CloudQuery("Messages");
    try {
        query.find(new CloudObjectArrayCallback(){
            @Override
            public void done(CloudObject[] x, CloudException t) {
                if(x != null){
                    Log.d("dozer74", "====>>>> x is not equal to null");
                } else {
                    Log.d("dozer74", "====>>>> x is equal to null");
                }

                if(t != null){
                    Log.d("dozer74", "====>>>> t is not equal to null");
                } else {
                    Log.d("dozer74", "====>>>> t is equal to null");
                }
            }
        });
    } catch (CloudException e) {
        e.printStackTrace();
    }


   return null;
  }

 }

Then execute the task in getTroopsFromDatabase

public void getTroopsFromDatabase(View view) {
    //Log.d("dozer74", "Get troops from database");
new Query().execute();
}