2016-07-10 2 views
0

Я пытался решить эту проблему более 2 часов. Мои запросы POST, похоже, работают в моем LoginActivity, но по какой-то причине они не работают в моей MainActivity.Volley Запросить работу только в LoginActivity

Мой веб-сервер отлично обрабатывает запросы.
Правильный в моем проекте URL-адрес, я просто изменил его здесь.

Вот 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); 
    } 
} 

Если я должен отправить что-нибудь еще, просто спросите. Надеюсь, кто-то узнает мою проблему, спасибо! :)

+0

Как ваш LoginActivity выглядеть? – Eenvincible

ответ

2

Я не уверен, но здесь, вероятно, есть ошибка.

 validateApiKey(); 
     if (apiKeyValid){ 

Volley запускает асинхронную задачу, и вы не получите ответ к тому времени, когда вызывается выражение.

Надеюсь, это поможет.

+0

Ударьте меня на 5 минут! – MidasLefko

+0

О, спасибо, как бы я это исправил? Есть ли лучшая библиотека или способ выполнить это, используя синхронную задачу? –

+0

Я только что получил его на работу, используя следующие:. 'новый android.os.Handler() postDelayed ( новый Runnable() { общественного недействительными запуска() { } }, 3000);' Но иногда он все еще не работает, если андроид не получил ответ вовремя, поэтому я все еще надеюсь, что кто-то может дать мне лучшее решение. Но поскольку это еще одна проблема, я принял ваш ответ, потому что это помогло мне найти причину проблемы :) –

1

Таймер может работать, но вы столкнетесь с такой же ошибкой, если вы находитесь на более медленном соединении, которое занимает более 3 секунд для ожидающего ответа.

Я бы предложил использовать обратный вызов как лучший подход.

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

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

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

И, наконец, когда вы называете StringRequest из OnCreate использовать анонимный внутренний класс, как это ..

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

Отлично работает, насколько я могу судить! Большое спасибо :) –

Смежные вопросы