Android App stürzt ab - Fehler im Code?

  • Antworten:7
  • Bentwortet
Crusha
  • Forum-Beiträge: 4

25.07.2020, 12:02:13 via Website

Moin,

ich beschäftige mich seit Kurzem mit der Programmierung von Android Apps. In einem Tutorial ging es um ein Login Skript welches auf eine MySQL Datenbank zugreift. Der Probelauf mit PHP und HTML Funktioniert gut. Also der Lokale Server steht und die Abfrage funktioniert.

Dennoch stürzt die App immer ab aus einem mir nicht erklärlichen Grund. Wenn ich den Debug richtig deute ist der Fehler in der ApiCkuent.java ...

Hier das ganze Projekt als Kopie in .txt Dateien sowie das Android Studio Projekt. github.com/ Crusha5/ AndroidLogin.git

Ich würde mich sehr über Hilfe freuen und Bedanke mich im voraus.

Debug Code:

2020-07-25 11:53:24.019 26624-26624/? I/e.example.urbe: Not late-enabling -Xcheck:jni (already on)

2020-07-25 11:53:24.047 26624-26624/? W/e.example.urbe: Unexpected CPU variant for X86 using defaults: x86
2020-07-25 11:53:24.126 26624-26624/de.example.urbex W/ActivityThread: Application de.example.urbex is waiting for the debugger on port 8100...
2020-07-25 11:53:24.128 26624-26624/de.example.urbex I/System.out: Sending WAIT chunk
2020-07-25 11:53:25.335 26624-26624/de.example.urbex I/System.out: Debugger has connected
2020-07-25 11:53:25.336 26624-26624/de.example.urbex I/System.out: waiting for debugger to settle...
2020-07-25 11:53:25.537 26624-26624/de.example.urbex I/chatty: uid=10099(de.example.urbex) identical 1 line
2020-07-25 11:53:25.738 26624-26624/de.example.urbex I/System.out: waiting for debugger to settle...
2020-07-25 11:53:25.939 26624-26624/de.example.urbex I/System.out: waiting for debugger to settle...
2020-07-25 11:53:26.545 26624-26624/de.example.urbex I/chatty: uid=10099(de.example.urbex) identical 3 lines
2020-07-25 11:53:26.746 26624-26624/de.example.urbex I/System.out: waiting for debugger to settle...
2020-07-25 11:53:26.948 26624-26624/de.example.urbex I/System.out: debugger has settled (1355)
2020-07-25 11:53:27.174 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden method Landroid/graphics/drawable/Drawable;->getOpticalInsets()Landroid/graphics/Insets; (light greylist, linking)
2020-07-25 11:53:27.174 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden field Landroid/graphics/Insets;->left:I (light greylist, linking)
2020-07-25 11:53:27.174 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden field Landroid/graphics/Insets;->right:I (light greylist, linking)
2020-07-25 11:53:27.174 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden field Landroid/graphics/Insets;->top:I (light greylist, linking)
2020-07-25 11:53:27.174 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden field Landroid/graphics/Insets;->bottom:I (light greylist, linking)
2020-07-25 11:53:27.302 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2020-07-25 11:53:27.303 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2020-07-25 11:53:27.318 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden method Landroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic; (light greylist, linking)
2020-07-25 11:53:27.374 26624-26624/de.example.urbex W/e.example.urbe: Accessing hidden method Ljava/lang/invoke/MethodHandles$Lookup;->(Ljava/lang/Class;I)V (light greylist, reflection)
2020-07-25 11:53:27.406 26624-26624/de.example.urbex D/AndroidRuntime: Shutting down VM
2020-07-25 11:53:27.416 26624-26624/de.example.urbex E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.example.urbex, PID: 26624
java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method
at okhttp3.internal.Util.(Util.java:87)
at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321)
at okhttp3.HttpUrl$Builder.parse(HttpUrl.java:1313)
at okhttp3.HttpUrl.get(HttpUrl.java:917)
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at de.example.urbex.ApiClient.getApiClient(ApiClient.java:17)
at de.example.urbex.MainActivity.onCreate(MainActivity.java:17)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassCastException: Bootstrap method returned null
at okhttp3.internal.Util.(Util.java:87) 
at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321) 
at okhttp3.HttpUrl$Builder.parse(HttpUrl.java:1313) 
at okhttp3.HttpUrl.get(HttpUrl.java:917) 
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506) 
at de.example.urbex.ApiClient.getApiClient(ApiClient.java:17) 
at de.example.urbex.MainActivity.onCreate(MainActivity.java:17) 
at android.app.Activity.performCreate(Activity.java:7136) 
at android.app.Activity.performCreate(Activity.java:7127) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:6669) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
2020-07-25 11:53:27.430 26624-26624/de.example.urbex I/Process: Sending signal. PID: 26624 SIG: 9

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.07.2020, 21:13:07 via Website

Ich glaube di brauchst die Java 1.8 Kompatiblität:
https://github.com/square/okhttp/issues/4597

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

25.07.2020, 13:38:00 via Website

Hallo
deine App srtürst in der Main Activity ab.

2020-07-25 11:53:27.416 26624-26624/de.example.urbex E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.example.urbex, PID: 26624
java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method
at okhttp3.internal.Util.(Util.java:87)

Ist das wirklich die komplette MainActivity die du und gegeben hast? Ich kann da nichts von okhttp3 finden.

Das Proplem wird wohl in der Klasse ApiClient ligen.

Du benutzt dort Retrofit das benutzt OkHttp.

einen Client übergiebst du auch nicht an Retrofit.
.client(client)

— geändert am 26.07.2020, 14:01:07

Hilfreich?
Kommentieren
Crusha
  • Forum-Beiträge: 4

25.07.2020, 20:43:09 via Website

Moin danke für deine schnelle Antwort.

ich kann damit nur leider nicht ganz so viel anfangen. Wie gesagt bin noch Anfänger und hangle mich an Tutorials und Büchern entlang.

Das der Fehler in der ApiClient.java liegt habe ich mir schon fast gedacht. Ich habe aber keinen schimmer was ich da ändern muss..

Es wehr super lieb wenn du mir das anhand eines Beispiel im Code erklären könntest.

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

25.07.2020, 21:09:07 via Website

sorry

— geändert am 26.07.2020, 13:59:31

Hilfreich?
Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.07.2020, 21:13:07 via Website

Ich glaube di brauchst die Java 1.8 Kompatiblität:
https://github.com/square/okhttp/issues/4597

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Jokel
Kommentieren
Crusha
  • Forum-Beiträge: 4

26.07.2020, 19:40:38 via Website

Vielen Dank! :)

build.grindel:

compileOptions {
        targetCompatibility =  JavaVersion . VERSION_1_8
        sourceCompatibility =  JavaVersion . VERSION_1_8
    }

.. und Build->Clean Project hat das Problem gelöst. Jetzt läuft die App ganz gut. bis auf einen "kleinen" Fehler??!

D/HostConnection: HostConnection::get() New Host Connection established 0xd1628cd0, tid 14040
D/HostConnection: HostComposition ext ANDROID_EMU_CHECKSUM_HELPER_v1 ANDROID_EMU_native_sync_v2 ANDROID_EMU_native_sync_v3 ANDROID_EMU_native_sync_v4 ANDROID_EMU_dma_v1 ANDROID_EMU_YUV420_888_to_NV21 ANDROID_EMU_YUV_Cache ANDROID_EMU_async_unmap_buffer GL_OES_EGL_image_external_essl3 GL_OES_vertex_array_object GL_KHR_texture_compression_astc_ldr ANDROID_EMU_gles_max_version_3_0
E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
D/EGL_emulation: eglMakeCurrent: 0xec949c80: ver 3 0 (tinfo 0xe8744d90)
D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 3 2

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.07.2020, 21:18:14 via App

Das wird eine Systemmeldung sein die für deine App nicht relevant ist. Sie stürzt ja auch nicht ab oder?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Crusha
  • Forum-Beiträge: 4

26.07.2020, 21:55:42 via Website

Die App stürtzt nicht ab aber wechselt aus irgend einem Grund nicht auf das WelcomeFragment.
Registrieren kann der "Nutzer" sich aber der Login funktioniert nur bedingt. Also ein neuer Datensatz wird angelegt und ist auch in der MySQL-Datenbank zu sehen.

Ich vermute der Fehler liegt irgendwo hier unter performLogin:

package de.example.urbex;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements LoginFragment.OnLoginFromActivityListener,WelcomeFragment.OnLogoutListener {

public static PrefConfig prefConfig;
public static ApiInterface apiInterface;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    prefConfig = new PrefConfig(this);
    apiInterface = ApiClient.getApiClient().create(ApiInterface.class);



    if (findViewById(R.id.fargment_container)!=null)
    {
        if (savedInstanceState!=null)
        {
            return;
        }
        if (prefConfig.readLoginStatus())
        {
            getSupportFragmentManager().beginTransaction().add(R.id.fargment_container, new WelcomeFragment()).commit();
        } else {
            getSupportFragmentManager().beginTransaction().add(R.id.fargment_container, new LoginFragment()).commit();
        }
    }
}
@Override
public void performRegister() {
    getSupportFragmentManager().beginTransaction().replace(R.id.fargment_container,
            new RegistrationFragment()).addToBackStack(null).commit();
}

@Override
public void performLogin(String name) {
    prefConfig.writerName(name);
    getSupportFragmentManager().beginTransaction().replace(R.id.fargment_container, new WelcomeFragment()).commit();
}

@Override
public void logoutPerformed() {
   prefConfig.writeLoginStatus(false);
   prefConfig.writerName("User");
    getSupportFragmentManager().beginTransaction().replace(R.id.fargment_container, new LoginFragment()).commit();
}

}

Und hier nochmal das LoginFragment:

package de.example.urbex;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class LoginFragment extends Fragment {

private TextView RegText;
private EditText UserName,UserPassword;
private Button LoginBn;

OnLoginFromActivityListener loginFromActivityListener;
public interface OnLoginFromActivityListener
{
   public void performRegister();
   public void performLogin(String name);
}

public LoginFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments()!=null) {
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_login, container, false);
    RegText = view.findViewById(R.id.register_txt);
    UserName = view.findViewById(R.id.user_name);
    UserPassword = view.findViewById(R.id.user_pass);
    LoginBn = view.findViewById(R.id.login_bn);

    LoginBn.setOnClickListener(view12 ->
            performLogin()) ;

    RegText.setOnClickListener(view1 ->
            loginFromActivityListener.performRegister());

    return view;
}

public void onAttach(Context context) {
    super.onAttach(context);
    Activity activity = (Activity) context;
    loginFromActivityListener = (OnLoginFromActivityListener) activity;

}

private void performLogin()
{
    String username = UserName.getText().toString();
    String password = UserPassword.getText().toString();

    Call<User> call = MainActivity.apiInterface.performUserLogin(username,password);
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            if (Objects.requireNonNull(response.body()).getResponse().equals("ok"))
            {
                MainActivity.prefConfig.writeLoginStatus(true);
                loginFromActivityListener.performLogin(response.body().getName());
            }
            else if (response.body().getResponse().equals("failed"))
            {
                MainActivity.prefConfig.displayToast("Login Failed..Please try again...");
            }
        }
        @Override
        public void onFailure(Call<User> call, Throwable t) {
        }
    });

    UserName.setText("");
    UserPassword.setText("");
}

}

Hilfreich?
Kommentieren