Android 想要中断线程,但线程为空
我想从另一个thread2中断一个thread1,但是当我尝试执行Android 想要中断线程,但线程为空,android,multithreading,null,android-context,Android,Multithreading,Null,Android Context,我想从另一个thread2中断一个thread1,但是当我尝试执行thread1.interrupt()时调用我得到一个空指针错误 我正在制作一个android应用程序,我在一个android登录页面上,当我登录时,我创建并启动一个名为sessionTimer(会话倒计时是2分钟)的线程。我想要的是,当我在另一个活动中按logout时,我进入登录页面,我的sessionTimer线程应该被中断,这样我就可以在最长时间内启动新的登录会话 package com.AndroidApp.Login;
thread1.interrupt()时代码>调用我得到一个空指针错误
我正在制作一个android应用程序,我在一个android登录页面上,当我登录时,我创建并启动一个名为sessionTimer
(会话倒计时是2分钟)的线程。我想要的是,当我在另一个活动中按logout时,我进入登录页面,我的sessionTimer
线程应该被中断,这样我就可以在最长时间内启动新的登录会话
package com.AndroidApp.Login;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.AndroidApp.R;
import com.AndroidApp.domain.Utente;
import com.AndroidApp.pagine.MenuPagina;
public class LoginActivity extends Activity {
final String TAG = "LogIN";
ArrayList<HashMap<String, String>> mylist;
private Button bLogin, bExit;
private EditText utente, passwd;
private MediaPlayer mpButtonClick = null;
private SharedPreferences mPreferences;
public volatile Thread sessionTimer;
public long tId = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
mPreferences = getSharedPreferences("CurrentUser", MODE_PRIVATE);
SharedPreferences.Editor editor = mPreferences.edit();
editor.clear();
editor.commit();
String nome = mPreferences.getString("nome", "Nessuno");
setTitle("Sessione di : " + nome);
Log.w("TotThreads", Integer.toString(Thread.activeCount()));
/*
final SessionTimer st = new SessionTimer();
*/
if(MenuPagina.reset){
Log.w("sessionTimer ID", Long.toString(sessionTimer.getId()));
if (sessionTimer == null)
Log.w("sessionTimer", "sessionTimer is NULL");
sessionTimer.interrupt();
System.out.println("end current session");
//st.stopRequest();
}
if (!checkLoginInfo()) {
mpButtonClick = MediaPlayer.create(this, R.raw.button);
bLogin = (Button)findViewById(R.id.bLogin);
bLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
mpButtonClick.start();
Log.v(TAG, "Trying to Login");
utente = (EditText)findViewById(R.id.etUtente);
passwd = (EditText)findViewById(R.id.etPassword);
String username = utente.getText().toString();
username = ("ccce@eex.it");
String password = md5(passwd.getText().toString());
password = md5("12345");
XMLFunctionsLogin.getInstance().setNewURL("u=" + username + "&p=" + password);
String xml = XMLFunctionsLogin.getXML();
Document doc = XMLFunctionsLogin.xmlFromString(xml);
int status = XMLFunctionsLogin.errStatus(doc);
Log.v("status", Integer.toString(status));
if ((status == 0)) {
NodeList nodes = doc.getElementsByTagName("login");
Element e = (Element) nodes.item(0);
Utente utente = new Utente();
utente.setIdUtente(XMLFunctionsLogin.getValue(e, "idUtente"));
utente.setNome(XMLFunctionsLogin.getValue(e, "nome"));
utente.setCognome(XMLFunctionsLogin.getValue(e, "cognome"));
Log.v("utente", utente.getCognome().toString());
List<NameValuePair> nvps = new ArrayList<NameValuePair>(2);
nvps.add(new BasicNameValuePair("utente", username));
nvps.add(new BasicNameValuePair("password", password));
Log.v(TAG, nvps.get(0).toString());
Log.v(TAG, nvps.get(1).toString());
// Store the username and password in SharedPreferences after the successful login
SharedPreferences.Editor editor = mPreferences.edit();
editor.putString("userName", username);
editor.putString("password", password);
editor.putString("idUtente", utente.getIdUtente());
editor.putString("nome", utente.getNome());
editor.putString("cognome", utente.getCognome());
editor.commit();
Log.v(TAG, "timer");
Log.v("RESET", Boolean.toString(MenuPagina.reset));
/*
Thread t = new Thread(st);
t.start();
*/
sessionTimer = new Thread() {
@Override
public void run() {
long tId = Thread.currentThread().getId();
Log.w("TTthread Id", Long.toString(tId));
for (int i = 30; i >= 0; i -= 1) {
if ((i == 0) || (MenuPagina.reset)) {
System.out.print("timer finito");
Log.i("Timer", "timer finito");
LoginActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(LoginActivity.this, "ti si è scaduta la sessione", Toast.LENGTH_LONG).show();
}
});
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
//System.exit(0);
} try {
Thread.sleep(1000);
Log.i("Timer", Integer.toString(i));
} catch (InterruptedException e) {
Log.i("Catch", "Catchhhhhhhhhhhh");
e.printStackTrace();
Thread.currentThread().interrupt();
return;
}
}
}
};
sessionTimer.start();
Log.v(TAG, "Successo2");
Toast.makeText(LoginActivity.this, "LogIn con successo", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getApplicationContext()/*LoginActivity.this*/, MenuPagina.class);
startActivity(intent);
} else {
final String errorMessage = XMLFunctionsLogin.errStatusDesc(doc);
Log.v("fallimento", errorMessage);
LoginActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(LoginActivity.this, errorMessage, Toast.LENGTH_LONG).show();
}
});
Intent intent = getIntent();
finish();
startActivity(intent);
}
}
});
bExit = (Button)findViewById(R.id.bExit);
bExit.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
mpButtonClick.start();
finish();
}
});
}
}
//Checking whether the username and password has stored already or not
private final boolean checkLoginInfo() {
boolean username_set = mPreferences.contains("UserName");
boolean password_set = mPreferences.contains("PassWord");
if ( username_set || password_set ) {
return true;
}
return false;
}
//md5 for crypting and hash
private static String md5(String data) {
byte[] bdata = new byte[data.length()];
int i;
byte[] hash;
for (i = 0; i < data.length(); i++)
bdata[i] = (byte) (data.charAt(i) & 0xff);
try {
MessageDigest md5er = MessageDigest.getInstance("MD5");
hash = md5er.digest(bdata);
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
StringBuffer r = new StringBuffer(32);
for (i = 0; i < hash.length; i++) {
String x = Integer.toHexString(hash[i] & 0xff);
if (x.length() < 2)
r.append("0");
r.append(x);
}
return r.toString();
}
}
package com.AndroidApp.Login;
导入java.security.GeneralSecurityException;
导入java.security.MessageDigest;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入org.apache.http.NameValuePair;
导入org.apache.http.message.BasicNameValuePair;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.NodeList;
导入android.app.Activity;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.media.MediaPlayer;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.Toast;
导入com.AndroidApp.R;
导入com.AndroidApp.domain.utete;
进口com.AndroidApp.pagine.MenuPagina;
公共类LoginActivity扩展了活动{
最后一个字符串TAG=“LogIN”;
ArrayList mylist;
私有按钮bLogin,bExit;
私有EditText-utente,passwd;
私有媒体播放器mpButtonClick=null;
私人共享参考文献;
公共易失性线程sessionTimer;
公众长期工贸总指数=-1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
mPreferences=getSharedReferences(“当前用户”,模式\私有);
SharedReferences.Editor=mPreferences.edit();
编辑器.clear();
commit();
字符串nome=mPreferences.getString(“nome”、“Nessuno”);
片名(“Sessione di:+nome”);
Log.w(“tothreads”,Integer.toString(Thread.activeCount());
/*
final SessionTimer st=新SessionTimer();
*/
如果(菜单设置重置){
Log.w(“sessionTimer ID”,Long.toString(sessionTimer.getId());
if(sessionTimer==null)
w(“sessionTimer”,“sessionTimer为空”);
sessionTimer.interrupt();
System.out.println(“结束当前会话”);
//st.stopRequest();
}
如果(!checkLoginInfo()){
mpButtonClick=MediaPlayer.create(这个,R.raw.button);
bLogin=(按钮)findviewbyd(R.id.bLogin);
bLogin.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图){
mpbutton单击.start();
Log.v(标记“尝试登录”);
utente=(EditText)findViewById(R.id.etUtente);
passwd=(EditText)findViewById(R.id.etPassword);
字符串username=utete.getText().toString();
用户名=(“ccce@eex.it");
字符串密码=md5(passwd.getText().toString());
密码=md5(“12345”);
XMLFunctionsLogin.getInstance().setNewURL(“u=“+username+”&p=“+password”);
字符串xml=XMLFunctionsLogin.getXML();
Document doc=XMLFunctionsLogin.xmlFromString(xml);
int status=XMLFunctionsLogin.errStatus(doc);
Log.v(“status”,Integer.toString(status));
如果((状态==0)){
NodeList节点=doc.getElementsByTagName(“登录”);
元素e=(元素)节点。项(0);
中尉中尉=新中尉();
setidute(XMLFunctionsLogin.getValue(e,“idute”);
setNome(XMLFunctionsLogin.getValue(e,“nome”);
setCognome(XMLFunctionsLogin.getValue(e,“cognome”);
Log.v(“utete”,utete.getCognome().toString());
列表nvps=新阵列列表(2);
添加(新的BasicNameValuePair(“Utene”,用户名));
添加(新的BasicNameValuePair(“密码”,password));
Log.v(TAG,nvps.get(0.toString());
Log.v(TAG,nvps.get(1.toString());
//成功登录后,将用户名和密码存储在SharedReferences中
SharedReferences.Editor=mPreferences.edit();
编辑器.putString(“用户名”,用户名);
编辑器.putString(“密码”,password);
putString(“idute”,utinte.getidute());
editor.putString(“nome”,utete.getNome());
editor.putString(“cognome”,utite.getCognome());
commit();
Log.v(标签“计时器”);
Log.v(“RESET”,Boolean.toString(MenuPagina.RESET));
/*
螺纹t=新螺纹(st);
t、 start();
*/
sessionTimer=新线程(){
@凌驾
公开募捐{
long tId=Thread.currentThread().getId();
Log.w(“TTthread Id”,Long.toString(tId));
对于(int i=30;i>=0;i-=1){
if((i==0)| |(MenuPagina.reset)){
系统输出打印(“计时器finito”);
日志(