0

別のスレッド 2 からスレッド 1 を中断したいのですが、thread1.interrupt();呼び出しを行うと、ヌル ポインター エラーが発生します。

私はAndroidアプリを作成しています.Androidログインページにいます.ログインすると、スレッドを作成して開始しますsessionTimer. 私が望むのは、別のアクティビティでログアウトを押すと、ログインページに移動し、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();
    }
}

そのため、ログアウトしてログイン ページに戻ると、nullMenuPagina.reset = trueであるというエラーが表示されます。sessionTimerなんで?

スレッドに別のクラスも使用しようとしましたが、同じヌルポインターエラーが発生します。

4

1 に答える 1

0

onCreateアクティビティが作成または再作成されているときに実行されます。いずれにしても新しいオブジェクトであるため、ローカル変数を再度初期化する必要があります。この場合、呼び出しsessionTimerまで null になります。new Thread() {}

スレッドへの参照を永続化する必要がある場合は、Activity よりも多くのグローバル オブジェクトを使用します - Application。これは、グローバル アプリケーションの状態を維持するための基本クラスです。を呼び出すことで、いつでもアクセスできますContext.getApplicationContext()。とにかく、ドキュメントを読んでください。

于 2012-04-24T10:05:32.193 に答える