2017-07-18 3 views
1

Ich entwickle eine App und ich bin in einer einfachen Sache blockiert.android Anruf gleichen Dialog zwei mal

In meiner Aktivität zeige ich einen Dialog (AlertDialog.Builder), der eine Mailadresse und eine Aktivierung fragt. Diese beiden Felder werden mit einer Rest-API überprüft.

Wenn der Aktivierungscode falsch ist, starte ich die Aktivität (mit einer Absicht) neu und ich zeige den Dialog erneut.

Ich verstehe nicht, warum, wenn ich falsch den Aktivierungscode beim ersten Mal, das zweite Mal erscheint der Dialog korrekt, aber wenn ich auf "Senden" klicken, führt die App nicht den Rest Anruf und zurück immer "Ungültige Anmeldeinformationen", als ob es den alten "Zustand" erinnern würde.

Stattdessen, wenn ich die App ausführen und ich die richtigen Anmeldeinformationen, alles ist in Ordnung.

Irgendeine Idee?

Quellcode:

public class PinActivity extends Activity { 

String mail; 
String verification; 
JSONObject responseServer; 
BluetoothSocket bsocket; 
ConnectedThreadBT cdbt; 
SharedPreferences sharedPref; 
SharedPreferences.Editor editor; 
EditText mail_add; 
EditText verification_code; 

@Override 
protected void onCreate (Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_check); 
    setup(); 

    dialogActivation(); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

private void setup(){ 
    RestClientManager.initialize(getApplicationContext()).enableDebugLog(true); 
    bsocket = BluetoothApplication.getBSocket(); 
    //salvo codice attivazione sul pacchetto 
    cdbt=new ConnectedThreadBT(bsocket,mHandler, "PinActivity"); 
    cdbt.start(); 



} 


private void dialogActivation(){ 


    android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog)); 
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.custom_dialog_verification, null); 
    mail_add = (EditText) view.findViewById(R.id.mailAddress); 
    verification_code = (EditText) view.findViewById(R.id.verification_code); 

    builder.setView(view). 
      setPositiveButton(getApplicationContext().getResources().getString(R.string.submit), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 


        //prendo e salvo credenziali 
        mail = mail_add.getText().toString(); 

        verification = verification_code.getText().toString(); 
        //invio dati al server 
        activatePPS(); 


       } 

      }); 


    builder.setCancelable(false); 
    builder.show(); 


} 


private void activatePPS(){ 

    dialogCheck(); 

    String url = "...."; 

    RestClientManager.getInstance().makeJsonRequest(Request.Method.POST, url, new RequestHandler<>(new RequestCallbacks<JSONObject, Error>() 
    { 
     @Override 
     public void onRequestSuccess(JSONObject response) 
     { 

      responseServer = response; 

      int reply_code = 0; 
      try { 
       reply_code = response.getInt("reply_code"); 
       checkReplyCode(reply_code); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


     } 

     @Override 
     public void onRequestError(Error error) 
     { 

     } 




    }, paramsList())); 


} 

private void dialogCheck(){ 



    android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(new ContextThemeWrapper(this, R.style.myDialog)); 
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.custom_dialog_load_check, null); 
    builder.setView(view); 
    builder.setCancelable(false); 
    builder.show(); 




} 

private void checkReplyCode(int reply_code) throws JSONException, IOException { 



    switch(reply_code){ 

     case 0: 

      successActivation(); 

      break; 
     case 1001: 
      //credenziali invalide 
      Toast.makeText(getApplicationContext(), getResources().getString(R.string.wrong_credentials), Toast.LENGTH_LONG).show();   

       Intent intent = new Intent(PinActivity.this, PinActivity.class); 
        startActivity(intent); 


      break; 


    } 


} 

private void successActivation() throws JSONException { 


    String access_token = responseServer.get("access_token").toString(); 
    String nickname = responseServer.get("..... 



    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      int value = sharedPref.getInt("step_conf",0); 
      if(value==0){ 
       Intent intent = new Intent(getApplicationContext(), MethodCurveActivity.class); 
       intent.putExtra("style", 0); 
       startActivity(intent); 
      } 
      else{ 
       Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
       startActivity(intent); 

      } 

     } 
    },3000); 



} 

private ArrayMap<String, String> paramsList(){ 


    ArrayMap<String, String> parameters=new ArrayMap<>(); 
    parameters.put("user_mail", mail); 
    parameters.put(..... 

    return parameters; 
} 

private void resetMobileDevice(){ 


    String url = "...."; 



    RestClientManager.getInstance().makeJsonRequest(Request.Method.POST, url, new RequestHandler<>(new RequestCallbacks<JSONObject, Error>() 
    { 
     @Override 
     public void onRequestSuccess(JSONObject response) 
     { 

      System.out.println("Risposta:"+response); 
      responseServer = response; 

      int reply_code = 0; 
      try { 
       reply_code = response.getInt("reply_code"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      try { 
       checkReplyCode(reply_code); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


     } 

     @Override 
     public void onRequestError(Error error) 
     { 

     } 

    }, paramsList())); 

} 

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 



     } 
    } 
}; 

} 

Der wichtige Punkt ist im "Fall 1001", nach dem Fehler. Ich habe versucht, finish() und das alle Verfahren, die alte Instanz der Aktivität zu löschen ...

+1

Schwierig, etwas ohne Ihren Quellcode zu beraten. – eleven

+0

@eleven Quelltext hier – hteo

+0

Warum genau möchten Sie die Aktivität bei falschen Anmeldeinformationen neu starten, warum nicht einfach Popup-Dialog wieder? – AndroidGeek

Antwort

1

Anwendungsklasse in Ihrem Projekt erstellen und RestClientManager in seiner onCreate Methode wie folgt initialisieren:

public class MyApp extends Application { 
    private final static String LOG_TAG = Application.class.getSimpleName(); 

    @Override 
    public void onCreate() { 
     Log.d(LOG_TAG, "Application.onCreate - Initializing application..."); 
     super.onCreate(); 
     initializeApplication(); 
     Log.d(LOG_TAG, "Application.onCreate - Application initialized OK"); 
    } 

    private void initializeApplication() { 
     RestClientManager.initialize(getApplicationContext()).enableDebugLog(true);  
    } 
} 

hinzufügen diese Zeile in Ihrem <Application> Tag in androidmanifest.xml Datei:

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:name=".App" 
     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> 

und stellen Sie sicher Ihre Singleton Struktur so etwas wie dies sein sollte:

private static RestClientManager instance; 

    static void initInstance() 
    { 
     if (instance == null) 
     { 
      // Create the instance 
      instance = new RestClientManager(); 
     } 
    } 

    public static RestClientManager getInstance() 
    { 
     // Return the instance 
     return instance; 
    } 

Denken Sie daran,

RestClientManager.initialize(getApplicationContext()).enableDebugLog(true);  

aus Ihrer Haupttätigkeit zu entfernen.

Bitte versuchen Sie es und lassen Sie es mich wissen.

+0

Sorry, aber RestClientManager ist eine externe Bibliothek (https://github.com/julianfalcionelli/SimpleRESTClientHandler), kann ich nicht ändern ... – hteo

+0

ok dann nicht ändern, nur in Application-Klasse initialisieren – AndroidGeek

+0

Ok, ich habe die Application-Klasse erstellt . In meiner Aktivität ist es richtig, wenn ich rufe: RestApplication ra = new RestApplication(); ?? Denn wenn ich die App starte, sieht sie, dass der restclientmanager nicht initialisiert ist ... – hteo

Verwandte Themen