Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.ClassNotFoundException: Didn't find class "retrofit2.Callback" on path: DexPathList #82

Closed
700brains opened this issue Oct 15, 2019 · 7 comments · Fixed by #104

Comments

@700brains
Copy link

Got this error when i have entered valid card details and hit pay, the app closes by itself.

E/AndroidRuntime: FATAL EXCEPTION: main
Process: team.hyperiontech.store, PID: 8380
java.lang.NoClassDefFoundError: Failed resolution of: Lretrofit2/Callback;
at co.paystack.android.Paystack.chargeCard(Paystack.java:67)
at co.paystack.android.Paystack.chargeCard(Paystack.java:57)
at co.paystack.android.PaystackSdk.chargeCard(PaystackSdk.java:151)
at team.hyperiontech.store.MainActivity.performCharge(MainActivity.java:103)
at team.hyperiontech.store.MainActivity.access$1200(MainActivity.java:20)
at team.hyperiontech.store.MainActivity$1.onClick(MainActivity.java:75)
at android.view.View.performClick(View.java:5675)
at android.view.View$PerformClick.run(View.java:22641)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6289)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.lang.ClassNotFoundException: Didn't find class "retrofit2.Callback" on path: DexPathList[[zip file "/data/app/team.hyperiontech.store-1/base.apk"],nativeLibraryDirectories=[/data/app/team.hyperiontech.store-1/lib/arm, /system/lib, /vendor/lib, /system/vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at co.paystack.android.Paystack.chargeCard(Paystack.java:67) 
at co.paystack.android.Paystack.chargeCard(Paystack.java:57) 
at co.paystack.android.PaystackSdk.chargeCard(PaystackSdk.java:151) 
at team.hyperiontech.store.MainActivity.performCharge(MainActivity.java:103) 
at team.hyperiontech.store.MainActivity.access$1200(MainActivity.java:20) 
at team.hyperiontech.store.MainActivity$1.onClick(MainActivity.java:75) 
at android.view.View.performClick(View.java:5675) 
at android.view.View$PerformClick.run(View.java:22641) 
at android.os.Handler.handleCallback(Handler.java:836) 
at android.os.Handler.dispatchMessage(Handler.java:103) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6289) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 
Process 8380 terminated.
MainActivity:
`package team.hyperiontech.store;

import android.support.multidex.MultiDex;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import co.paystack.android.Paystack;
import co.paystack.android.PaystackSdk;
import co.paystack.android.Transaction;
import co.paystack.android.model.Card;
import co.paystack.android.model.Charge;

public class MainActivity extends AppCompatActivity {
private Card card;
private Charge charge;

private EditText emailField;
private EditText cardNumberField;
private EditText expiryMonthField;
private EditText expiryYearField;
private EditText cvvField;

private String email, cardNumber, cvv;
private int expiryMonth, expiryYear;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MultiDex.install(this);
    //init paystack sdk1
    PaystackSdk.initialize(getApplicationContext());
    //init paystack sdk2

// App sdk = new App();
// sdk.onCreate();

    //init view
    Button payBtn = (Button) findViewById(R.id.pay_button);

    emailField = (EditText) findViewById(R.id.edit_email_address);
    cardNumberField = (EditText) findViewById(R.id.edit_card_number);
    expiryMonthField = (EditText) findViewById(R.id.edit_expiry_month);
    expiryYearField = (EditText) findViewById(R.id.edit_expiry_year);
    cvvField = (EditText) findViewById(R.id.edit_cvv);


    payBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!validateForm()) {
                return;
            }
            try {
                email = emailField.getText().toString().trim();
                cardNumber = cardNumberField.getText().toString().trim();
                expiryMonth = Integer.parseInt(expiryMonthField.getText().toString().trim());
                expiryYear = Integer.parseInt(expiryYearField.getText().toString().trim());
                cvv = cvvField.getText().toString().trim();

                //String cardNumber = "4084084084084081";
                //int expiryMonth = 11; //any month in the future
                //int expiryYear = 18; // any year in the future
                //String cvv = "408";
                card = new Card(cardNumber, expiryMonth, expiryYear, cvv);

                if (card.isValid()) {
                    Toast.makeText(MainActivity.this, "Card is Valid", Toast.LENGTH_LONG).show();
                    performCharge();
                } else {
                    Toast.makeText(MainActivity.this, "Card not Valid", Toast.LENGTH_LONG).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


/*Method to perform the charging of the card
 */
private void performCharge() {
    //create a Charge object
    charge = new Charge();

    //set the card to charge
    charge.setCard(card);

    //call this method if you set a plan
    //charge.setPlan("PLN_yourplan");

    charge.setEmail(email); //dummy email address

    charge.setAmount(100); //test amount

    PaystackSdk.chargeCard(MainActivity.this, charge, new Paystack.TransactionCallback() {
        @Override
        public void onSuccess(Transaction transaction) {
            // This is called only after transaction is deemed successful.
            // Retrieve the transaction, and send its reference to your server
            // for verification.
            String paymentReference = transaction.getReference();
            Toast.makeText(MainActivity.this, "Transaction Successful! payment reference: "
                    + paymentReference, Toast.LENGTH_LONG).show();
        }

        @Override
        public void beforeValidate(Transaction transaction) {
            // This is called only before requesting OTP.
            // Save reference so you may send to server. If
            // error occurs with OTP, you should still verify on server.
        }

        @Override
        public void onError(Throwable error, Transaction transaction) {
            //handle error here
        }
    });
}

private boolean validateForm() {
    boolean valid = true;

    String email = emailField.getText().toString();
    if (TextUtils.isEmpty(email)) {
        emailField.setError("Required.");
        valid = false;
    } else {
        emailField.setError(null);
    }

    String cardNumber = cardNumberField.getText().toString();
    if (TextUtils.isEmpty(cardNumber)) {
        cardNumberField.setError("Required.");
        valid = false;
    } else {
        cardNumberField.setError(null);
    }


    String expiryMonth = expiryMonthField.getText().toString();
    if (TextUtils.isEmpty(expiryMonth)) {
        expiryMonthField.setError("Required.");
        valid = false;
    } else {
        expiryMonthField.setError(null);
    }

    String expiryYear = expiryYearField.getText().toString();
    if (TextUtils.isEmpty(expiryYear)) {
        expiryYearField.setError("Required.");
        valid = false;
    } else {
        expiryYearField.setError(null);
    }

    String cvv = cvvField.getText().toString();
    if (TextUtils.isEmpty(cvv)) {
        cvvField.setError("Required.");
        valid = false;
    } else {
        cvvField.setError(null);
    }

    return valid;
}

}
Manifest:


<dist:module dist:instant="true" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    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>
    <meta-data
        android:name="co.paystack.android.PublicKey"
        android:value="pk_test_my_valid_test_key_here"/>
</application>

`

@chydee
Copy link

chydee commented Oct 30, 2019

I am also facing this issue

@chydee
Copy link

chydee commented Oct 30, 2019

Updated guys: you can fix the issue by adding
//Retrofit Dependency
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'

@opezyhick just showed me how

@tkalejaiye
Copy link

HI @chydee what file did you have to add those two lines to?

@chydee
Copy link

chydee commented Oct 31, 2019

build.gradle (module: app) file
Inside dependencies{
....
}

@studywithlawz
Copy link

Thanks chydee

@skyestudiosDev
Copy link

I wonder why you initiate multidex inside activity onCreate?

@opezyhick
Copy link

I wonder why you initiate multidex inside activity onCreate?

Yeah ..
He should be initiated at AppActivity.....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants