[英]how to start new activity on successful login in the following code?
我在我的应用程序中有以下课程,我正在向远程服务器发送用户名和密码,并在服务器端发送其匹配值并发送响应。 一切正常。 我想问一下登录成功后如何启动新活动。 我希望消息消失时开始新的活动。 QnActivity是我要开始的活动,LoActivity是我当前的活动。 我已经尝试了很多,但没有成功。 我还添加了
startActivity(new Intent(LoActivity.this, QnActivity.class));
在public void Move_to_next()
方法中,但public void Move_to_next()
。
Java代码
public class LoActivity extends Activity {
Intent i;
Button signin;
TextView error;
CheckBox check;
String name="",pass="";
byte[] data;
HttpPost httppost;
StringBuffer buffer;
HttpResponse response;
HttpClient httpclient;
InputStream inputStream;
SharedPreferences app_preferences ;
List<NameValuePair> nameValuePairs;
EditText editTextId, editTextP;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
signin = (Button) findViewById (R.id.signin);
editTextId = (EditText) findViewById (R.id.editTextId);
editTextP = (EditText) findViewById (R.id.editTextP);
app_preferences = PreferenceManager.getDefaultSharedPreferences(this);
check = (CheckBox) findViewById(R.id.check);
String Str_user = app_preferences.getString("username","0" );
String Str_pass = app_preferences.getString("password", "0");
String Str_check = app_preferences.getString("checked", "no");
if(Str_check.equals("yes"))
{
editTextId.setText(Str_user);
editTextP.setText(Str_pass);
check.setChecked(true);
}
signin.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
name = editTextId.getText().toString();
pass = editTextP.getText().toString();
String Str_check2 = app_preferences.getString("checked", "no");
if(Str_check2.equals("yes"))
{
SharedPreferences.Editor editor = app_preferences.edit();
editor.putString("username", name);
editor.putString("password", pass);
editor.commit();
}
if(name.equals("") || pass.equals(""))
{
Toast.makeText(Lo.this, "Blank Field..Please Enter", Toast.LENGTH_SHORT).show();
}
else
{
try {
httpclient = new DefaultHttpClient();
httppost = new HttpPost("http://abc.com/register.php");
// Add your data
nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("UserEmail", name.trim()));
nameValuePairs.add(new BasicNameValuePair("Password", pass.trim()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
response = httpclient.execute(httppost);
inputStream = response.getEntity().getContent();
data = new byte[256];
buffer = new StringBuffer();
int len = 0;
while (-1 != (len = inputStream.read(data)) )
{
buffer.append(new String(data, 0, len));
}
inputStream.close();
}
catch (Exception e)
{
Toast.makeText(LoActivity.this, "error"+e.toString(), Toast.LENGTH_SHORT).show();
}
if(buffer.charAt(0)=='Y')
{
Toast.makeText(LoActivity.this, "login successfull", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(LoActivity.this, "Invalid Username or password", Toast.LENGTH_SHORT).show();
}
}
}
});
check.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// Perform action on clicks, depending on whether it's now checked
SharedPreferences.Editor editor = app_preferences.edit();
if (((CheckBox) v).isChecked())
{
editor.putString("checked", "yes");
editor.commit();
}
else
{
editor.putString("checked", "no");
editor.commit();
}
}
});
}
public void Move_to_next()
{
startActivity(new Intent(LoActivity.this, QnActivity.class));
}
}
您正在ui线程上运行网络实现的操作。 使用线程或异步任务
response = httpclient.execute(httppost);
如果您在ui线程上运行与网络相关的操作,则会在蜂窝状结构后得到NetworkOnMainThreadException
并确保您在代码中调用Move_to_next()
。
在ui线程上调用AsyncTask
new TheTask().execute();
异步任务
class TheTask extends AsyncTask<Void,Void,Void>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
// dispaly progress dialog
}
@Override
protected void doInbackground(Void... params)
{
// do network related operation here
// do not update ui here
return null; // return result here
}
@Override
protected void onPostExecute(Void result) // result of background computation received
{
super.onPostExecute(result);
// dimiss dialog
// update ui here
}
}
它很难说为什么 ,因为你还没有告诉我们如何不工作也不能正常工作。 但是,您应该将网络调用移至另一个Thread
。 将其放在AsyncTask
。 在doInBackground()
做网络工作。
然后,在网络工作结束后,如果登录成功,则可以将结果发送到onPostExecute()
并从那里调用startActivity()
。
我的猜测是,您永远不会调用方法Move_to_next()
我建议一旦您从服务器获得良好的响应就调用它,但是,您也应该接受@Ragunandan的建议,并在单独的线程上运行请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.