[OFFEN] If (loginSuccess) dann neue Activity

D

Deepkey

Neues Mitglied
0
Hey liebe Community ,
Ich bin seit drei Monaten in einer Informatiker (Fian) Ausbildung und programmiere neben bei an meinen Projekt und
hab da ein kleines Problem. Vlt. steh ich auch einfach nur auf den Schlauch oder mein Ansatz ist komplett falsch.
Ich hab eine Login abfrage von username und passwort, wenn diese erfolgreich ist soll dann erst die userarea geladen werden.
Verbindung zur Datenbank steht und php Script gibt JSon Antwort.

bei der if (loginsend) funktioniert es nur mit (!).

wäre cool wenn ihr mir helfen könnt.


hier erstmal der Code.

die Main

Code:
package com.example.root.framespielerei;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import static com.example.root.framespielerei.Loginrequest.success;

public class MainActivity extends Activity{
    Button login;
    TextView registerNow;
    EditText et_username, et_passwort;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerNow = findViewById(R.id.tv_register_now);
        login = findViewById(R.id.btn_login);



    }

    public void login(View view) {
        MainActivity.super.onPause();
        setContentView(R.layout.loginform);
        Button back,login;


        back = findViewById(R.id.btn_back);
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MainActivity.super.onResume();
                setContentView(R.layout.activity_main);
                Toast.makeText(MainActivity.this,"You go back",Toast.LENGTH_LONG).show();
            }
        });

        login = findViewById(R.id.btn_loginsend);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loginsend();

                if (!loginsend()){
                    Toast.makeText(MainActivity.this,"jippi",Toast.LENGTH_LONG).show();
                }
            }
        });
}

    boolean loginsend() {
        et_username = findViewById(R.id.et_username);
        et_passwort = findViewById(R.id.et_passwort);

        String username = et_username.getText().toString();
        String passwort = et_passwort.getText().toString();

        new Loginrequest(this).execute(username,passwort);
        

        Toast.makeText(this, "Checkt LogIn .....\n in arbeit", Toast.LENGTH_SHORT).show();

        return success;
    }

   /* public void loginsend(View view) {
        et_username = findViewById(R.id.et_username);
        et_passwort = findViewById(R.id.et_passwort);

        String username = et_username.getText().toString();
        String passwort = et_passwort.getText().toString();

        new Loginrequest(this).execute(username,passwort);

        Toast.makeText(this, "Checkt LogIn .....\n in arbeit", Toast.LENGTH_SHORT).show();
        Loginrequest.gibtrue(success);
        if (!success){
            Toast.makeText(MainActivity.this,"jippi",Toast.LENGTH_LONG).show();

        }

    }*/

}

Die LoginRequest

Code:
package com.example.root.framespielerei;


import android.annotation.SuppressLint;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;


class Loginrequest extends AsyncTask<String,Void,String>{
    @SuppressLint("StaticFieldLeak")
    Context context;
    public static boolean success;

    Loginrequest(Context context) {

        this.context = context;

    }


     @Override
    protected String doInBackground(String... dit) {
        String username = dit[0];
        String passwort = dit[1];
        String link;
        String data;
        BufferedReader bf;
        String result;


         try {

             data = "?username=" + URLEncoder.encode(username, "UTF-8");
             data += "&password=" + URLEncoder.encode(passwort, "UTF-8");

             link = "http://10.0.2.2/UserLogin.php" + data;
             URL url = new URL(link);
             HttpURLConnection con = (HttpURLConnection) url.openConnection();


             bf = new BufferedReader(new InputStreamReader(con.getInputStream()));
             result = bf.readLine();
             return result;

         }catch (Exception e){
             return ("Exception: " + e.getMessage());
         }

    }

    @Override
    protected void onPostExecute(String result){

        if (result != null) {


            try {

                JSONObject jsonObj = new JSONObject(result);

                String query_result = jsonObj.getString("query_result");

                switch (query_result) {
                    case "SUCCESS":

                        success = true;
                        Toast.makeText(context, "Erfolgreich eingelogt..\nDaten werden geladen.", Toast.LENGTH_SHORT).show();

                        break;

                    case "FAILURE":
                        success = false;
                        Toast.makeText(context, "Dieser User existiert nicht \n oder Passwort falsch!", Toast.LENGTH_SHORT).show();

                        success = false;
                        break;
                    case "FAILURETOP":

                        success = false;
                        Toast.makeText(context, "nüchscht rein nüscht keine verbindung.", Toast.LENGTH_LONG).show();

                        break;
                    default:

                        success = false;
                        Toast.makeText(context, "Server nicht Erreichbar...\n checken sie die verbindung!", Toast.LENGTH_LONG).show();

                        break;
                    case "USEREMPTYERR":

                        success = false;
                        Toast.makeText(context, "Es wurde kein Username eingegeben\n bitte erneut versuchen", Toast.LENGTH_LONG).show();

                        break;
                    case "USERPASSEMPTYERR":

                        success = false;
                        Toast.makeText(context, "Es wurde keine LoginDaten eingegeben\n bitte erneut versuchen", Toast.LENGTH_LONG).show();

                        break;
                    case "PASSEMPTYERR":

                        success = false;
                        Toast.makeText(context, "Es wurde kein Passwort eingegeben\n bitte erneut versuchen", Toast.LENGTH_LONG).show();

                        break;
                    case "USERNOTEXIST":

                        success = false;
                        Toast.makeText(context, "Sry User gibbet nich\n bitte erneut versuchen", Toast.LENGTH_LONG).show();

                        break;


                }


            }catch (JSONException e){
                e.printStackTrace();
                success = false;
                Toast.makeText(context, "fehler in der Verbindungsdatei\nerrorRequest (0 011ef8 ).", Toast.LENGTH_LONG).show();

            }
        }

    }

}
 
keiner einen Rat wie ich den boolean wert von der einen klasse auslesen kann?
 
damit wollt ich die Frage nochmal genauer stellen
 
Sorry, ehrlich gesagt wollte ich nicht antworten weil der Code meiner Meinung nach zeigt dass du Grundkonzepte noch nicht verstanden/verinnerlicht hast. (Activities, AsyncTask, Control Flow)

Nur soviel: Du startest einen AsyncTask der Netzwerk macht. Das dauert potentiell ein paar Sekunden. Sofort nach dem Start gibst du den Wert einer statischen Variable dieses TAsks (statisch ist oft ein Fehler, hier definitiv) weiter und liest den Wert aus. Zu diesem Zeitpunkt hat dein AsyncTask (der wie der Name asynchron also in einem eigenen Thread läuft) noch gar nichts sinnvolles getan. Daher ist dein success immer false.

Du musst in der onPostExecute des AsyncTask deiner Activity irgendwie (das ist Hausaufgabe) Bescheid sagen, dass er fertig ist. Dann springt diese auf Aufforderung an und checkt den success Wert.
 
  • Danke
Reaktionen: Kardroid und swa00
Ich will es auch nicht bestreiten und hab es auch nicht behauptet. Hab ich selber nach drei Monaten nicht erwartet. Wenn es anders wäre würde die Frage nicht aufkommen. ;)

Halb so wild denk ich mir, ich will es ja lernen. Ich hab schon mehrere Tuts. durch und Verbindung, Einloggen, Registrieren klappt.... kleines Eingenlob :)
ich versuche es jetzt mal mit den Boolean doInBackground.
 
Es war auch absolut nicht böse gemeint, jeder hat mal angefangen. Das Problem als potentiell Antwortender ist einfach wo man anfängt ;)
Ich hoffe die kurzen Hinweise, die ich dir gegeben habe helfen dir etwas und bei neuen konkreten Fragen kannst du natürlich gerne wieder hier anfragen!
 
Ich kann dich voll verstehen, ich weiß meine Frage selber meist nicht genau zu stellen :blink:
Ich will eig. nur, neben den Benachrichtigungen(Toast), einen Boolean wert zurückbekommen damit mein Programm weiß dass es weiter gehen kann. Schaff es nicht und hab leider keinen den ich in meiner Umgebung fragen kann:bored: bzw. mit den ich mich mal hinsetzten könnte um es mir erklären zu lassen. (Was mega wäre) also falls hier eine Lerngruppe in Berlin existiert würde ich mich anschließen.

Wenn du mir einen Link hast zum einlesen bezüglich meines Problems wäre ich auch dankbar. Will es ja auch verstehen nicht nur funktional besitzen.
Ansonsten ,über einen Hilfreichen Ansatz wo in meinen Code anzufangen wäre , hab ich auch Augen und Ohren offen.
 
Hallo Deepkey,

ich habe jetzt mich mal hingesetzt und deinen Code "durchforstet".

Ich muss mich leider der Meinung von deek anschliessen und ich verstehe auch , dass du
versuchst deine Frage ein wenig eindeutiger zu formulieren.

Allerdings ist es schon ein wenig mühsam aus deinem Code die Linie zu erkennen , so dass
man auch als "Profi" nicht so recht erkennen kann , wo du welche Schraube (Boolean) zu deinem Glück nun
drehen sollst.


Auf alle Fälle darfst du erst im PostExecute deine Flags setzen , um sicherzustellen , dass
dein Request vernünftig abgeschlossen wurde


Man müsste sich schon jetzt deinen Source nehmen und selbst in ein neues Projekt einbinden,
um dir dann was Vernünftiges schreiben zu können .

Und das sprengt natürlich den Rahmen einer Forenhilfe.
Deinem Konzept fehlt es ein wenig an Struktur und vor allem an fundiertem Wissen.
Besonders das Grundverständniss , wann was anzuwenden ist und somit einen sicheren Fluss
zu garantieren .

Das ist auch nicht böse gemeint , aber du hättest eigentlich dir eher ein
einfaches Projekt zum Lernen als Ziel setzen sollen.
 
Zuletzt bearbeitet:
Als "Selbstudium" für Android ist es meist schwer dieses selbst zu erkennen. Wie sich die Zeit zeigen wird werden die Fragen sich doch auch zum Wissen mit entwickeln.
Aber es hilft doch trotzdem . Schlagwörter mit denen ich mich befassen werde.
Das wird schon. Wachse gerne mit mein Projekt und mit etwas Geduld und Nachsicht mit mir, werden die Gespräche auch interessanter.
Trotzdem Danke und wenn ich's hab gebe ich Bescheid zur nächsten Einsicht :biggrin:
 
Hallo @Deepkey,

leider muss ich meinen Vorgänger beipflichten. Der Code wirkt unstrukturiert.

So macht
public void login(View view) {
MainActivity.super.onPause();
...
}

keinen Sinn. Warum rufst du die Methode MainActivity.super.onPause(); auf? Du steuerst nicht den Lifecycle, sondern deine App reagiert darauf.

Die Verwendung von public static boolean success ist in diesem Kontext falsch angewandt. Du fragst Sie in der MainActivity viel zu früh ab. Und zwar bevor der Asynctask die Methode onPostExecute() aufgerufen hat. Soweit ich das sehe, fehlt Dir zur Zeit das Verständnis für das Observer Pattern und der Runtime (was wann im Code ausgeführt wird).

Besser wäre es wenn der Asynctask eine innere Klasse der MainActivity wäre, dann kann du ohne große Probleme auf die Variablen der MainActivity zugreifen. Probiere es einfach mal aus. Und beschäftige mit Design Pattern und UML2. Wenigsten UML wirst du für deine Abschlussprüfung brauchen.
 
Wie gesagt ich nehme es ja nicht böse auf wenn mir gute Ratschläge zur Verbesserung von ähm Allen :rolleyes2: , gegeben werden.
Letzten 2 Tage mit Männer Grippe flach gelegen. Deswegen jetzt erst gelesen.
Ich hab schon mitbekommen das ich oft zurückgehen muss weil meine Planung nicht so gut ist.
Leider sind wir noch nicht bei Java angekommen. Steht nächstes Jahr erst auf den Plan.
Ich werde mich auch mal hinsetzten und eine Grafische Darstellung machen, Problem da wann wo welche Funktionen wie verarbeitet werden.
Sieht bisher immer sehr 2. Klasse Zeichenkurs aus mit viel Papierkügelchen.

ich hab es jetzt so gelöst gehabt.
Code:
@Override
    protected void onPostExecute(String result){

        if (result != null) {


            try {

                JSONObject jsonObj = new JSONObject(result);

                String query_result = jsonObj.getString("query_result");
                String id = jsonObj.getString("id");
                switch (query_result) {
                    case "SUCCESS":


                        Toast.makeText(context, "Erfolgreich eingelogt..\nDaten werden geladen.", Toast.LENGTH_SHORT).show();
                        
                        Intent homepage = new Intent( context, UserAreaActivity.class);
                        Thread.sleep(3000);
                        // Alle views schließen
                        // homePage
                        homepage.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        //homepage.putExtra();     // hier dann noch die id mit übergeben
                        context.startActivity(homepage);

                        break;


Ich werde dein Rat aber befolgen und es ausprobieren. Nur weil es bei mir mal funktioniert muss es ja nicht gut sein :laugh:
Danke dir für deine Antwort.:thumbsup:
 

Ähnliche Themen

Laser5001
Antworten
3
Aufrufe
652
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
538
jogimuc
J
M
  • maksimilian
Antworten
15
Aufrufe
1.712
maksimilian
M
Zurück
Oben Unten