2017-10-04 62 views
0

我遇到問題。如果我的設備在服務器中註冊,服務器將生成409響應。所以當我將設備註冊到服務器時,我將服務器生成的ID響應保存在共享首選項管理器中。但由於某些原因,ID未存儲在共享偏好管理器中。我是android開發的新手,我不知道現在該做什麼。請幫我解決這個問題。響應409,共享首選項管理器

共享偏好管理器的

public class SharedPrefManager { 

    private static final String SHARED_PREF_NAME = "fcmsharedprefdemo"; 

    private static Context mCtx; 
    private static SharedPrefManager mInstance; 

    private SharedPrefManager(Context context){ 
     mCtx = context; 
    } 

    public static synchronized SharedPrefManager getInstance(Context context){ 
     if(mInstance == null) 
      mInstance = new SharedPrefManager(context); 
     return mInstance; 
    } 


    public boolean storeDeviceId(String deviceId){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(d_Id, deviceId); 
     editor.apply(); 
     return true; 
    } 
    public String getDeviceId(){ 
     SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); 
     return sharedPreferences.getString(d_Id, null); 
    } 

} 

這是我的共享偏好管理器,我加入的主要活動。

public class MainActivity extends AppCompatActivity { 
    public static String deviceId = ""; 
    public static Context context; 
    public SharedPrefManager sharedInst; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    context = getApplicationContext(); 
    sharedInst = SharedPrefManager.getInstance(context); 
    setContentView(R.layout.activity_main); 

    IMEI_NUMBER = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID); 

    if(sharedInst.getDeviceId() == null){ 
     HashMap<String, String> params = new HashMap<String, String>(); 
     params.put("name", IMEI_NUMBER); 

     JsonObjectRequest req = new JsonObjectRequest(server_url, new JSONObject(params), 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         String s = "id"; 
         try { 
          deviceId = response.getString(s); 
          sharedInst.storeDeviceId(deviceId); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.e("Error: ", error.getMessage()); 
        } 
       } 
     ); 
     ApplicationController.getInstance().addToRequestQueue(req); 
    } 
    Log.d("deviceID:", sharedInst.getDeviceId()); 
} 

共享首選項管理器只是存儲設備的ID並獲取設備ID還存儲fcm令牌並獲取fcm令牌。

在我的代碼中,我試圖保存從服務器獲得的deviceId作爲響應。但是我面臨的問題是deviceId由於某種原因沒有得到存儲。一些android guru能幫助我解決這個問題,爲什麼deviceId沒有被存儲。我在這裏錯過了很明顯的東西。有什麼我必須添加到代碼中。我沒有正確生成實例,這是設備ID未生成的原因。我可以看到調用正確地對服務器進行,​​服務器也正在生成deviceId。

也可以有人告訴我如何處理像409這樣的回覆,我希望我的程序能夠運行,儘管得到這些迴應。

+0

歡迎來到堆棧溢出!哇,這是很多代碼。如果包含複製錯誤所需的最小代碼量,則更有可能得到答案 –

+0

如果可能,現在是否可以幫助我,爲什麼deviceId沒有被存儲。它給出null – Bijju

回答

0

我意識到問題出在哪裏!問題在於凌空。我將3個請求添加到隊列中,第二個和第三個請求在完成第一個請求後完成。但問題是第二個和第三個請求取決於第一個請求響應。這就是爲什麼我的程序停止並給我一個錯誤。

有人可以幫助我如何發送一個請求,只有在得到迴應後。現在每個請求都被添加到隊列中,但是我需要的是在收到第一個請求的響應之後,我應該發送下兩個請求。

這裏是我的volleyManager代碼

public class ApplicationController extends Application { 

public static final String TAG = "VolleyPatterns"; 
private RequestQueue mRequestQueue; 
private static ApplicationController sInstance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    sInstance = this; 
} 


public static synchronized ApplicationController getInstance() { 
    return sInstance; 
} 


public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
    } 

    return mRequestQueue; 
} 

public <T> void addToRequestQueue(Request<T> req, String tag) { 
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 

    VolleyLog.d("Adding request to queue: %s", req.getUrl()); 

    getRequestQueue().add(req); 
} 

public <T> void addToRequestQueue(Request<T> req) { 
    // set the default tag if tag is empty 
    req.setTag(TAG); 

    getRequestQueue().add(req); 
} 


public void cancelPendingRequests(Object tag) { 
    if (mRequestQueue != null) { 
     mRequestQueue.cancelAll(tag); 
    } 
    } 

} 

請讓我知道如何做到這一點。