我目前正在与一个朋友一起从事一个项目,在那里我们有一个网站托管登录详细信息等。当用户登录时,它将返回一个令牌返回该应用程序,用作用户进一步呼叫的验证。(即获取个人资料)。我需要在其他活动中传递此令牌(这是一个字符串),然后我尝试使用意图,但是每次尝试使用nullPointerException
时,我称之为的班级找不到。我要发送的额外。我已经尝试将代码用于在onCreate
方法的顶部创建意图的代码,但是(我假设)令牌没有值,因为它没有使用JSONOBJECT请求,因为它尚未由服务器发送,因为该代码没有值然而。这是主要活动的代码(删除了所有链接)(我还没有包括所有导入和可变声明,因为我认为它们是不必要的)
String Name,Pass,tokenString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
token = (TextView) findViewById(R.id.TV1);
name = (EditText) findViewById(R.id.name);
pass = (EditText) findViewById(R.id.pass);
register = (Button) findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Name = name.getText().toString();
Pass = pass.getText().toString();
if(Name.equals("") || Pass.equals("")){
Toast.makeText(MainActivity.this, "Fields cannot be left empty!", Toast.LENGTH_SHORT).show();
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, Url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
setToken(jsonObject.getString("token"));
launchHomeActivity();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(error.networkResponse.statusCode==401) {
Toast.makeText(MainActivity.this, "Incorrect login details, please retry", Toast.LENGTH_SHORT).show();
}
}
}){
protected Map<String,String> getParams() throws AuthFailureError{
Map<String,String> params = new HashMap<String, String>();
params.put("key", "****");
params.put("email", Name);
params.put("password", Pass);
return params;
}
};
MySingleton.getInstance(MainActivity.this).addToRequestQueue(stringRequest);
name.setText("");
pass.setText("");
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchRegisterActivity();
}
});
}
private void launchRegisterActivity() {
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
}
private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
private void setToken(String token){
tokenString = token;
}
public String getToken(){
return tokenString;
}
public void createIntent(){
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i);
}
}
这是家庭活动的代码(相关位):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
token = (TextView) findViewById(R.id.TV1) ;
title = (TextView) findViewById(R.id.welcome_Txt);
Bundle extras = getIntent().getExtras();
final String tokenString = extras.getString("Token");
StringRequest stringRequest = new StringRequest(Request.Method.GET, ProfileUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
// JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = new JSONObject(response);
title.setText("Welcome back " + jsonObject.getString("token") + "!");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
protected Map<String,String> getParams() throws AuthFailureError{
Map<String,String> params = new HashMap<String, String>();
params.put("key", "****");
params.put("Token", tokenString);
return params;
}
};
MySingleton.getInstance(Home.this).addToRequestQueue(stringRequest);
}
任何帮助都非常感谢。
(P.S,我是Android Studio的新手,并且我去学习)
从服务器获得响应后,您仅调用启动性化方法。但是您仅在"创建"方法中设置数据。我认为这是问题。我已经编辑了启动性化方法。
private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
intent .putExtra("Token", getToken());
startActivity(intent);
}
您在OnResponse()
和accessToken
上获得响应后正在调用launchHomeActivity()
。但是您将token
存储在createIntent()
上,该CC_7从未被调用。因此,在获得token
之后,请在OnResponse()
方法上调用createIntent()
。
这不是将令牌从Activity
传递到Activity
的最佳实践。更好的是将token
存储在SharedPrefrence
上,并从任何Wherer中访问它。做一个单顿SharedPreference
类,您可以在整个应用程序上使用它。
调用活动时您没有添加捆绑包(Extras)例如
Intent intent = new Intent(this, Home.class);
intent.putExtra("Token", "XXX-YYY-ZZZ"); //Imp
startActivity(intent);
尝试这样做..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
token = (TextView) findViewById(R.id.TV1) ;
title = (TextView) findViewById(R.id.welcome_Txt);
String extras = getIntent().getStringExtra("Token);
,但我建议您更好地将其保存在共享的偏好中,并在您的所有活动中使用。
例如:
用于偏好设置值:
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME,
MODE_PRIVATE).edit();
editor.putString("Token", getToken);
editor.apply();
用于从首选中检索数据:
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME,
MODE_PRIVATE);
String restoredText = prefs.getString("text", null);
if (restoredText != null) {
String name = prefs.getString("Token", "No name defined");//"No name
defined"
is the default value.
}
您使用两个不同的意图来调用相同的active.class文件。仅使用两种不同的使用1意图,而仅将数据放在该意图上。不需要两个不同的意图来打电话回家。级活动。
private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
startActivity(intent);}
public void createIntent(){
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i);}
尝试这样。
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i)
and on your Home activity get data like below code.
Intent intent=getIntent();
String token=intent.getStringExtra("token");