2016-07-10 5 views
0

Ich habe versucht, dieses Problem seit über 2 Stunden jetzt zu lösen. Meine POST-Anfragen scheinen alle in meiner LoginActivity zu funktionieren, aber aus irgendeinem Grund nicht in meiner MainActivity.Volley Anfrage funktioniert nur in LoginActivity

Mein Webserver verarbeitet Anfragen in Ordnung.
Die URL ist in meinem Projekt korrekt, ich habe es hier geändert. Hier

ist die MainActivity:

package com.my.app; 


import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 

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

import java.util.HashMap; 
import java.util.Map; 

import okhttp3.MediaType; 

public class MainActivity extends AppCompatActivity { 

    String serverResponse; 

    Boolean apiKeyValid = false; 

    // User Data 
    String status, userID, username, klasse, email, fullname, description, pb, classRep, schoolRep, mod, lastLogin, firstVisit, bugsFound, apiKey, userSummary; 

    public void validateApiKey(){ 
     SharedPreferences sp = 
       getSharedPreferences("Authentication", 
         Context.MODE_PRIVATE); 
     if (sp.contains("apiKey")) { 
      apiKey = sp.getString("apiKey", "false"); 

      RequestQueue MyRequestQueue = Volley.newRequestQueue(this); 
      String url = "http://mydomain/api/v1/apiKeyValid"; 
      StringRequest MyStringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         serverResponse = response; 
         JSONObject userData = new JSONObject(response); 

         status = userData.getString("status"); 
         if (status.equals("valid")) { 
          apiKeyValid = true; 
         } 
        } catch (JSONException e) { 
         Log.e("App", "unexpected JSON exception", e); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }) { 
       protected Map<String, String> getParams() { 
        Map<String, String> MyData = new HashMap<String, String>(); 
        MyData.put("apiKey", apiKey); 
        return MyData; 
       } 
      }; 
      MyRequestQueue.add(MyStringRequest); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     validateApiKey(); 
     if (apiKeyValid){ 
      TextView hello = (TextView) findViewById(R.id.hi); 
      String msg = "Api Key is valid! :)\n" + "ApiKey: " + apiKey; 
      hello.setText(msg); 
     } 
     else{ 
      Intent intent = new Intent(this, LoginActivity.class); 
      startActivity(intent); 
     } 
    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Wenn ich etwas anderes schreiben sollte, einfach fragen. Hoffentlich erkennt jemand mein Problem, danke! :)

+0

Wie sieht Ihr LoginActivity aussehen? – Eenvincible

Antwort

2

Ich bin mir nicht sicher, aber es ist wahrscheinlich ein Fehler hier.

Volley führt eine asynchrone Aufgabe aus, und Sie haben keine Antwort, wenn die Anweisung aufgerufen wird.

Ich hoffe, es hilft.

+0

Beat mich um 5 Minuten! – MidasLefko

+0

Oh danke !, Wie würde ich das beheben? Gibt es eine bessere Bibliothek oder einen besseren Weg, um dies mit einer synchronen Aufgabe zu erreichen? –

+0

Ich habe es einfach zu arbeiten, indem Sie die folgenden:. 'neue android.os.Handler() postDelayed ( neue Runnable() { public void run() { } }, 3000);' Aber manchmal funktioniert es immer noch nicht, wenn Android die Antwort nicht rechtzeitig bekommen hat, so hoffe ich immer noch, dass jemand mir eine bessere Lösung geben kann. Aber da dies ein anderes Problem ist, akzeptierte ich Ihre Antwort, weil es mir half, die Ursache des Problems zu finden :) –

1

Der Timer funktioniert möglicherweise, aber Sie werden auf dasselbe Problem stoßen, wenn Sie eine langsamere Verbindung verwenden, die länger als 3 Sekunden für die ausstehende Antwort dauert.

Ich würde vorschlagen, einen Rückruf als einen besseren Ansatz zu verwenden.

public interface VolleyCallback{ 
    void onResult(Boolean result); 
} 

public void validateApiKey(final VolleyCallback callback){... 

public void onResponse(String response) {... callback.onResult(true); 

Und schließlich, wenn Sie Ihre StringRequest von onCreate verwenden Ihre anonyme innere Klasse wie folgt nennen ..

validateApiKey(new VolleyCallback() { 
     @Override 
     public void onResult(Boolean response) { 
      if (apiKeyValid){.... 
+0

Funktioniert perfekt, soweit ich das beurteilen kann! Danke vielmals :) –

Verwandte Themen