2015-06-22 27 views
0

我爲我的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加以確認。我是否應該使用AsyncTaskonPostExecute()確保完成後臺任務,然後繼續下一個活動?或者有什麼辦法可以使用callback interfases

+0

你在這裏幫助我吧? –

+0

您將數據保存到數據庫的位置?在JSON請求的onResponse()中使用 – Muthu

+0

。在我的onResponse示例代碼中,我只保存了userId,而downloadDataOnLogin()方法也將一些數據保存到由另一個JSOn請求獲取的DB中。 –

回答

0

首先,您需要在您的主要活動如下

interface RequestComplete{ 
void oncompleted(); 
} 

創建一個接口,並實現它們

public class LoginActivity extends FragmentActivity implements RequestComplete { 
    ....... 
    @override 
    void oncompleted(){ 
    //Your navigation code 
    } 
} 

和內部

public void downloadDataOnLogin(int userid,int post_type_id, int post_page_number){ 
    ......... 
    postDao.insertOrReplace(post); 
//after your insert completed 
((RequestComplete)context).RequestComplete(); 
} 

上面的例子給你一個想法如何有用。