我爲我的Android項目使用Volley
庫。以下是我想要做的事情: 我在我的應用程序中有一個登錄屏幕,我將從中獲取用戶詳細信息,並通過JSON
請求將其發送到服務器,作爲響應,提供驗證狀態。然後立即向服務器發送另一個JSON
請求,以獲取其他用戶詳細信息並使用greenDao
ORM將其保存到本地數據庫。將詳細信息保存到數據庫之後,我將導航用戶到下一個活動並顯示從本地數據庫獲取的詳細信息。但是,只要我導航到onResponse()
方法中的下一個活動,它不會顯示詳細信息,這意味着從服務器獲取的數據當前未保存在數據庫中。是否因爲Volley
在背景中做了些事情,而且還沒有完成?我知道Volley
在後臺單獨執行thread
,因此不需要使用AsyncTask
,但onPostExecute()
可以保證保存到數據庫的任務已完成,並且可以導航到下一個activity
。
如果你沒有得到我的問題,這是我的代碼。 LoginActivity.java
排球庫和AsyncTask
package com.example.example.nxtstepzone;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast
import com.android.volley.toolbox.RequestFuture;
import com.example.example.nxtstepzone.Networking.AppController;
import com.example.example.nxtstepzone.Networking.DataFromServer;
public class LoginActivity extends FragmentActivity {
Context context;
Button l;
EditText email,password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
email = (EditText)findViewById(R.id.email);
password=(EditText)findViewById(R.id.password);
l=(Button)findViewById(R.id.button_login);
l.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DataFromServer ds= new DataFromServer(LoginActivity.this);
ds.downloadDataLogin(email.getText().toString(), password.getText().toString());
}});
}
}
這裏是DataFromServer
類,我已經實現的方法
package com.example.nxtstepzone.Networking;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.RequestFuture;
import com.example.example.nxtstepzone.HomeActivity;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.orhanobut.hawk.Hawk;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
import de.greenrobot.dao.query.QueryBuilder;
import example.DaoMaster;
/**
* Created by Prathya on 6/14/2015.
*/
public class DataFromServer {
Context context;
private Keys keys;
DaoMaster.DevOpenHelper helper;
SQLiteDatabase db;
DaoMaster daoMaster;
DaoSession session;
UserDao userDao;
PostDao postDao;
QueryBuilder qb;
public DataFromServer(Context context){
this.context = context;
keys = new Keys();
helper = new DaoMaster.DevOpenHelper(context,"nxtstepz",null);
db =helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
session = daoMaster.newSession();
userDao= session.getUserDao();
postDao = session.getPostDao();
}
public void downloadDataLogin(final String email,String password){
final ProgressDialog progressDialog;
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
progressDialog.show();
String loginurl = "http://example.com/webservice/webservice.php?oper=checklogin&username="+email+"&password="+password;
JsonObjectRequest req = new JsonObjectRequest(loginurl, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
int status = response.getInt("status");
if(status==1){
Hawk.init(context);
Hawk.put("userid", Integer.parseInt(response.getString(keys.KEY_USER_ID)));
Toast.makeText(context, "Logged in" , Toast.LENGTH_SHORT).show();
User user= new User();
user.setId(Long.parseLong(response.getString(keys.KEY_USER_ID))); //some details saved to DB
userDao.insertOrReplace(user);
downloadDataOnLogin(Integer.parseInt(response.getString(keys.KEY_USER_ID)),2,0); // request for further details using downloadDataOnLogin method
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
Intent in = new Intent(context, HomeActivity.class); //navigating to next activity
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(in);
}
else{
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Authentication Failed !");
builder.setMessage("Incorrect username or password")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
catch (Exception e){
Toast.makeText(context,"Server error!..",Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(progressDialog.isShowing()){
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Network Error");
builder.setMessage("Couldn't connect to server.Check internet connection and Try again")
.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
AppController.getInstance().addToRequestQueue(req);
}
public void downloadDataOnLogin(int userid,int post_type_id, int post_page_number){
String onloginurl="http://example.com/webservice/webservice.php?oper=getallactivities&userid="+userid+"&type="+post_type_id+"&page="+post_page_number;
JsonArrayRequest req = new JsonArrayRequest(onloginurl, new Response.Listener<JSONArray>(){
@Override
public void onResponse(JSONArray response) {
for(int i=0;i<response.length();i++){
try {
JSONObject jsonObject = response.getJSONObject(i);
Post post = new Post();
post.setPosttypeid(jsonObject.getString("post_type_id"));
//here I'm saving the details to database.
postDao.insertOrReplace(post);
}catch (JSONException e){
}
}
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppController.getInstance().addToRequestQueue(req);
}
}
注意將數據保存到數據庫的代碼後,我導航到下一個activity
。但是,當新的Activity
啓動時,仍然不會將數據保存到數據庫,並且我已通過將breakpoints
加以確認。我是否應該使用AsyncTask
的onPostExecute()
確保完成後臺任務,然後繼續下一個活動?或者有什麼辦法可以使用callback interfases
?
你在這裏幫助我吧? –
您將數據保存到數據庫的位置?在JSON請求的onResponse()中使用 – Muthu
。在我的onResponse示例代碼中,我只保存了userId,而downloadDataOnLogin()方法也將一些數據保存到由另一個JSOn請求獲取的DB中。 –