我遇到了问题。如果我的设备在服务器中注册,则服务器生成409响应。因此,当我将设备注册到服务器时,我将保存服务器在共享首选项管理器中生成的ID响应。但由于某种原因,ID未存储在共享首选项管理器中。我是Android开发的新手,我现在不知道该怎么做。请帮我解决这个问题。
共享首选项管理器
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并获取devicesID,它还存储fcm标记并获取fcm标记。
在我的代码中,我试图保存我从服务器获得的响应中的deviceId。但我面临的问题是deviceId由于某种原因没有被存储。一些android大师可以帮助我解决这个问题,为什么deviceId没有被存储。我错过了一些明显的东西。有什么我必须添加到代码中。我没有正确生成实例,这就是没有生成设备ID的原因。我可以看到呼叫正确地发送到服务器,服务器也正在生成deviceId。
也有人可以告诉我如何处理像409这样的回复,我希望我的程序可以运行,尽管得到了这些回复。
答案 0 :(得分: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);
}
}
}
请让我知道怎么做。