簡體   English   中英

android第二次線程執行錯誤

[英]thread execution error for the second time android

下午好,請問我的英語不是很好。 我有一個具有各種活動的應用程序,但基本上可以定義如下:

主要活動>新建警報>主要活動>警報>新建警報>線程執行錯誤

基本上是主要活動,我有一個帶有個人適配器的ExpandableListView,該適配器協調選項菜單。 只需單擊菜單警報,然后單擊菜單子“新警報”,重定向到活動“新警報”,將量信息輸入數據庫,並運行服務(Hilo),該服務負責將系統時間與引入的時間進行比較。

代碼MainActivity:

public class MainActivity extends Activity {
    SparseArray<GrupoDeItems> grupos = new SparseArray<GrupoDeItems>();
    Hilos hilo,hilo2;
    Switch estado_drunk_blocker;
    Switch estado_alarma;
    GrupoDeItems grupo0 = new GrupoDeItems("Drunk Blocker");
    GrupoDeItems grupo1 = new GrupoDeItems("Alarma");
    adaptador adapter;
    Intent salto = new Intent();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        crearDatos();
        hilo2 = new Hilos("bd");
        hilo2.execute();


        estado_drunk_blocker = (Switch) findViewById(R.id.switch1);
        estado_alarma = (Switch) findViewById(R.id.switch2);
        ExpandableListView listView = (ExpandableListView) findViewById(R.id.listViewexp);
        adaptador adapter = new adaptador(this, grupos);
        listView.setAdapter(adapter);

    }

    public void crearDatos() {
        grupo0.children.add("Preferencias");
        grupo0.children.add("Configuración");
        grupos.append(0, grupo0);

        grupo1.children.add(0,"Nueva Alarma");
        grupos.append(1, grupo1);
    }

    public void AgregarAlarma_ConPos(String valor,int posicion){
        grupo1.children.add(posicion,valor);
        grupos.append(1,grupo1);
    }

    public void AgregarAlarma(String valor){
        grupo1.children.add(valor);
        grupos.append(1,grupo1);
    }

    public void LanzarDrunkBlocker(View view) throws InterruptedException {
        boolean on = estado_drunk_blocker.isChecked();
        if (on) {
            hilo = new Hilos("drunk blocker");
            hilo.execute();
        }
    }

    public void GenerarSaltos(Activity origen, Class destino){
        salto.setClass(origen,destino);
        startActivity(salto);
    }

   /* public void GenerarSaltos_ConservandoValores(Activity origen, Class destino, int codigo){

        Intent salto = new Intent(origen,destino);
        origen.startActivityForResult(salto,codigo);
    }
 */

    public void HacerUnaPausa(){
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {}
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    public class Hilos extends AsyncTask<Void, Void, Boolean> {
        String valor;
        Cursor cursor;
        DataBaseManager manager;

       public Hilos(String parametro){
           valor = parametro;
       }

        @Override
        protected Boolean doInBackground(Void... params) {
        boolean pasar = true;

            if(valor.equals("drunk blocker")) {
                for (int i = 0; i < 10; i++) {

                    HacerUnaPausa();
                    if (!estado_drunk_blocker.isChecked()) {
                       Toast.makeText(MainActivity.this,"Entre en la cancelacion",Toast.LENGTH_SHORT).show();
                        cancel(true);
                        pasar = false;
                        break;
                    }

                }

                if (pasar) {
                    startActivity(new Intent(MainActivity.this,Drunk_Blocker.class));
                    cancel(true);
                }
            }


            if (valor.equals("bd")){
                Actualizar_Alarmas();
                Verificar_Hilo_Alarma();
            }

            return true;
        }

        @Override
        protected void onPreExecute() {

            if(valor.equals("drunk blocker")) {
                Toast.makeText(MainActivity.this,"Cuenta con 10 segundos antes del bloqueo",Toast.LENGTH_SHORT).show();
            }


        }

        public void Actualizar_Alarmas(){
            manager = new DataBaseManager(MainActivity.this);
            cursor = manager.Cargar_Cursor_Alarmas();

            int posicion = 1;
            if (cursor.moveToFirst()){
                do {
                    String id = cursor.getString(0);
                    String horas = cursor.getString(1);
                    String minutos = cursor.getString(2);
                    String horario = cursor.getString(3);
                    String etiqueta = cursor.getString(4);
                    String estado_alarma = cursor.getString(5);

                    AgregarAlarma_ConPos(horas + ":" + minutos + " " + horario + "       " + etiqueta + " ---" + estado_alarma, posicion);
                    posicion++;
                }while(cursor.moveToNext());

                cursor.close();

            }
        }

        public void Verificar_Hilo_Alarma(){
            manager = new DataBaseManager(MainActivity.this);
            cursor = manager.Cargar_Cursor_Alarmas();

            if (cursor.moveToFirst()){
                do {
                    String id = cursor.getString(0);
                    String horas = cursor.getString(1);
                    String minutos = cursor.getString(2);
                    String horario = cursor.getString(3);
                    String etiqueta = cursor.getString(4);
                    String estado_alarma = cursor.getString(5);
                    if (estado_alarma.equals("activa")){
                       // Toast.makeText(MainActivity.this,"Si hay una alarma activa!!",Toast.LENGTH_LONG).show();
                      //  manager.Insertar_Tabla_Estado_Hilo(0);
                       // int probando=Buscar_Datos_Hilo(manager);
                        //Toast.makeText(MainActivity.this,"probando : "+probando+"",Toast.LENGTH_LONG).show();

                        //if (probando==1){
                   //       Toast.makeText(MainActivity.this,"Si veo TABLAAAAAAAA!!",Toast.LENGTH_LONG).show();
                        //  cursor.moveToLast();
                          //manager.Modificar_Campo_Tabla_Hilo("1",1);
                          startService(new Intent(MainActivity.this,MyService.class));
                          cancel(true);
                          onCancelled();
                          break;

                       //}
                    }
                    }while(cursor.moveToNext());

                cursor.close();
            }
        }

    }
}

它第一次成功運行並到達兩個相等的時間,將它們重定向到執行應做的警報活動並重定向到主要活動,嘗試創建或修改新的阿拉瑪文件以輸入數據並按Pin時會出現問題接受生成的線程執行錯誤,表示該線程已在運行,無法再次運行。

我結束了每條線路都滿足了我感興趣的條件,而不是第二次運行,或者如果活動已重定向但沒有成功停止,並且某些設備重新運行了該服務,即使您控制了,也可能是適配器中的主要活動未完成活動和適配器的工作參數

public adapter (Activity act ....) {

活動=行動;
}

代碼適配器(個人適配器)

public class adaptador extends BaseExpandableListAdapter {
    private final SparseArray<GrupoDeItems> grupos;
    public LayoutInflater inflater;
    public Activity activity;
    MainActivity obj = new MainActivity();

    // Constructor
    public adaptador(Activity act, SparseArray<GrupoDeItems> grupos) {
        activity = act;
        this.grupos = grupos;
        inflater = act.getLayoutInflater();
    }

    // Nos devuelve los datos asociados a un subitem en base
    // a la posición

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return grupos.get(groupPosition).children.get(childPosition);
    }

    // Devuelve el id de un item o subitem en base a la
    // posición de item y subitem

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }

    // En base a la posición del item y de subitem nos devuelve
    // el objeto view correspondiente y el layout para los subitems

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final String children = (String) getChild(groupPosition, childPosition);
        TextView textvw = null;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.subitems_layout, null);
        }
        textvw = (TextView) convertView.findViewById(R.id.textView1);
        textvw.setText(children);
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        Intent ine = new Intent();
                //Esto emite una pequeña ventana de alerta con el mensaje seleccionado
                //Toast.makeText(activity, children, Toast.LENGTH_SHORT).show();
                switch (groupPosition){
                    case 0:
                        ine.setClass(activity,Drunk_Blocker.class);
                        switch (childPosition){
                          case 0:
                                activity.startActivity(ine);
                                //obj.GenerarSaltos(activity,Drunk_Blocker.class);
                                break;

                          case 1:
                                activity.startActivity(ine);
                                //obj.GenerarSaltos(activity,Drunk_Blocker.class);
                                break;
                        }
                        break;
                    case 1:

                        DataBaseManager manager = new DataBaseManager(activity);
                        Cursor cursor = manager.Cargar_Cursor_Alarmas();
                        cursor.moveToFirst();
                        switch (childPosition){
                            case 0:
                                ine.setClass(activity,Nueva_Alarma.class);
                                if(cursor.getCount()<3) {
                                    activity.finish();
                                    activity.startActivity(ine);
                                }
                                else
                                   Toast.makeText(activity,"Solo puede tener 1 alarma",Toast.LENGTH_SHORT).show();
                                //obj.GenerarSaltos(activity,Alarma.class);
                                break;
                            case 1:
                                activity.finish();
                                ine.setClass(activity,Modificar_Alarma.class);
                                ine.putExtra("identificador",cursor.getString(0));
                                activity.startActivity(ine);
                                break;

                            case 2:
                                cursor.moveToPosition(1);
                                ine.setClass(activity,Modificar_Alarma.class);
                                ine.putExtra("identificador",cursor.getString(0));
                                activity.startActivity(ine);
                                break;

                            case 3:
                          /*      cursor.moveToPosition(2);
                                ine.setClass(activity,Modificar_Alarma.class);
                                ine.putExtra("identificador",cursor.getString(0));
                                activity.startActivity(ine);
                                break;

                            case 4:
                                cursor.moveToPosition(3);
                                ine.setClass(activity,Modificar_Alarma.class);
                                ine.putExtra("identificador",cursor.getString(0));
                                activity.startActivity(ine);
                                break;

                            case 5:
                                cursor.moveToPosition(4);
                                ine.setClass(activity,Modificar_Alarma.class);
                                ine.putExtra("identificador",cursor.getString(0));
                                activity.startActivity(ine);
                                break;*/
                            //asigna una imagen a un teim o subitem
                            //textvw.setCompoundDrawablesWithIntrinsicBounds(R.drawable.pescadofrito, 0, 0, 0);

                        }
                        cursor.close();
                       // 
                        break;
                }
            }
        });

        textvw.setText(children);

        return convertView;
    }

    // Nos devuelve la cantidad de subitems que tiene un ítem
    @Override
    public int getChildrenCount(int groupPosition) {
        return grupos.get(groupPosition).children.size();
    }


    //Los datos de un ítem especificado por groupPosition
    @Override
    public Object getGroup(int groupPosition) {
        return grupos.get(groupPosition);
    }

    //La cantidad de ítem que tenemos definidos
    @Override
    public int getGroupCount() {
        return grupos.size();
    }

    //Método que se invoca al contraer un ítem
    @Override
    public void onGroupCollapsed(int groupPosition) {
        super.onGroupCollapsed(groupPosition);
    }

    //Método que se invoca al expandir un ítem
    @Override
    public void onGroupExpanded(int groupPosition) {
        super.onGroupExpanded(groupPosition);
    }

    //Devuelve el id de un ítem
    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }

    //Obtenemos el layout para los ítems
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.items_layout, null);
        }
        GrupoDeItems grupo = (GrupoDeItems) getGroup(groupPosition);
        ((CheckedTextView) convertView).setText(grupo.string);
        ((CheckedTextView) convertView).setChecked(isExpanded);
        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    //Nos informa si es seleccionable o no un ítem o subitem
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
}

代碼Myservice(線程警報)

public class MyService extends Service {
    Intent salto = new Intent();
    MyTask myTask;

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Alarma creada!", Toast.LENGTH_LONG).show();
        myTask = new MyTask();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Toast.makeText(this,"Antes de ejecutar------------------ "+myTask.getStatus().toString(),Toast.LENGTH_LONG).show();
        if (myTask.getStatus().toString().equals("FINISHED") || myTask.getStatus().toString().equals("PENDING")) {

            if (myTask.getStatus().toString().equals("RUNNING")){
                myTask.cancel(true);
            }

            myTask.execute();
        }
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
      //  Toast.makeText(getApplicationContext(), "Alarma cancelada!", Toast.LENGTH_SHORT).show();
        myTask.cancel(true);
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public void GenerarSaltos(Activity origen, Class destino){
        salto.setClass(origen,destino);
        startActivity(salto);
    }

public class MyTask extends AsyncTask<String, String, String> {

    private DateFormat dateFormat;
    private String date;
    private boolean cent;
    DataBaseManager manager;
    Cursor cursor;
    ArrayList<String> vec2 = new ArrayList<String>();
  /*  public MyTask(Activity act){
        manager = new DataBaseManager(act);
        activity2 = act;
    }*/

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dateFormat = new SimpleDateFormat("HH:mm:ss");
        cent = true;
        manager = new DataBaseManager(getApplicationContext());
    }

    @Override
    protected String doInBackground(String... params) {
        String cadena;
        String[] vec;
        int horas_sys=0,minutos_sys=0,segundos_sys=0;
        while (cent){
            date = dateFormat.format(new Date());
            cursor = manager.Cargar_Cursor_Alarmas();
            cadena = date;
            vec = cadena.split(":");
            horas_sys =  Integer.parseInt(vec[0]);
            minutos_sys =  Integer.parseInt(vec[1]);
            segundos_sys =  Integer.parseInt(vec[2]);
            if (horas_sys>12){
                horas_sys = horas_sys - 12;
            }else{
                if (horas_sys==0){
                    horas_sys=12;
                }
            }

           // publishProgress(horas_sys+" "+minutos_sys+" "+segundos_sys);
            cursor.moveToFirst();
            if (cursor.moveToFirst()){
                do {
                    String id = cursor.getString(0);
                    String horas = cursor.getString(1);
                    String minutos = cursor.getString(2);
                    String horario = cursor.getString(3);
                    String etiqueta = cursor.getString(4);
                    String estado_alarma = cursor.getString(5);
                  //  publishProgress("horas sistema: "+horas_sys+" hora alarma: "+horas);
                    if (horas_sys==Integer.parseInt(horas)){
                       // publishProgress("Solo horas: "+horas);

                        if (minutos_sys==Integer.parseInt(minutos)){
                          //publishProgress("Horas: " + horas + " minutos " + minutos);
                            cursor = manager.Cargar_Cursor_Alarmas();
                            vec2 = manager.Recorrer_Cursor(cursor);
                            cadena = Recorrer_ArrayList(vec2);
                            manager.Modificar_Campo("1",cadena);


                            Intent hola = new Intent(getApplicationContext(),Alarma.class);
                                hola.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(hola);

                                cent = false;
                                cancel(true);
                                onCancelled();
                                break;

                            }
                        }
                     }while(cursor.moveToNext());
                    cursor.close();
                }

                if (cent==true){
                    try {
                        // Stop 5s
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                    e.printStackTrace();
                    }
                }


            }
            return null;
        }

        public String Recorrer_ArrayList(ArrayList<String> vec){
            String[] cadena = vec.get(0).split("/");
            String retorno = cadena[0];

            for (int i = 1; i <cadena.length -1 ; i++) {
                retorno = retorno + "/" + cadena[i];
            }

            retorno = retorno + "/" + "noactiva";
            return retorno;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            Toast.makeText(getApplicationContext(), values[0], Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
            cent = false;
        }
    }
}

有什么想法嗎?

AsyncTask只能使用一次。 在onCreate()中,創建AsyncTask onStartCommand() ,使用AsyncTask。 如果再次調用onStartCommand() ,它將嘗試再次使用AsyncTask 這是不允許的。

onStartCommand()創建AsyncTask

最終通過在滿足我的條件以使其停止時調用MyService類中的stopActivity()方法來解決該問題,從而完成了線程作為服務的工作並正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM