2015-02-19 2 views
0

Я столкнулся с проблемой, я изучаю андроид и что использовать Runnable Thread и обработчик для изменения темы пользовательского интерфейса. Я уже знаю, как это сделать, используя AsynkTask i ' m просто пытается научиться делать это в обоих направлениях, проблема в том, что мое приложение зависает, а затем падает, я думаю, что решение должно использовать postDelayed, но я не знаю, как его применять, вот что я придумал:Android: Thread Runnable and Handler

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //MORE CODEE 
    handler(); 
} 

Мой Handler в UI Thread (основной) Это я призываю OnCreate:

private void handler() 
    { 
     HandlerMessage = new Handler(){ 

      @Override 
      public void handleMessage(Message msg) { 

       Bundle infoBundle = msg.getData(); 

       int index= infoBundle.getInt(KEY_HANDLER_INDEX); 

       switch(index) 
       { 
       case CHANGE_COLOR: 

        eColors selectedColor = (eColors) infoBundle.getSerializable(KEY_HANDLER_COLOR); 
        myTextViewMain.setBackgroundColor(eColors.enumToColor(selectedColor)); 
        myLayoutMain.setBackgroundColor(eColors.enumToColor(selectedColor)); 

        break; 

       case STARTING_EXECUTION: 

        Toast.makeText(getApplicationContext(), "Handler: Sending SOS...", 
          Toast.LENGTH_SHORT).show(); 
        myTextViewMain.setBackgroundColor(Color.WHITE); 
        myLayoutMain.setBackgroundColor(Color.WHITE); 

        break; 

       case STOP_EXECUTION: 

        Toast.makeText(getApplicationContext(), "Handler: Cancel SOS...", 
          Toast.LENGTH_SHORT).show(); 
        System.out.println("Stop"); 
        changeColor(currentColor); 

        break; 

       default: 
       } 

      } 

     }; 
    } 

Что я использовать, чтобы создать новую тему:

private void workingWithBottle(taskWork work) { 

     if(work == taskWork.STOP){ 

      sosButton.setEnabled(true); 
      StingHandler.cancelExecution(); 

     }else{ 
      if (work == taskWork.START) 
      { 
       sosButton.setEnabled(false); 
       StingHandler = new handlerMessageInABottle(HandlerMessage); 
       StingHandler.run(); 
      } 
     } 
} 

Моя Runnable в отдельном файле:

//handlerMessageInABottle.java 
package com.izonfreak.lightadvance; 

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import com.izonfreak.lightadvance.MainActivity.eColors; 

public class handlerMessageInABottle implements Runnable { 

    boolean stopWorking = false; 
    Message myMessage; 
    Bundle myBundle; 
    eColors workColor; 
    Handler myHandler; 

    private final String KEY_HANDLER_INDEX = "HANDLER_INDEX"; 
    private final String KEY_HANDLER_COLOR = "HANDLER_COLOR"; 
    private static final int CHANGE_COLOR=1, STARTING_EXECUTION =2 , STOP_EXECUTION =3; 


    handlerMessageInABottle(Handler handler) 
    { 
     myHandler = handler; 

    } 
    @Override 
    public void run() { 
     String mourseMessage = "...---..."; 
     int i=0, time =0; 

     sendToHandler(STARTING_EXECUTION); 

     while (true) { 

      System.out.println(mourseMessage); 

      if(mourseMessage.charAt(i)=='.') 
       time = 1000; 
      else if (mourseMessage.charAt(i)=='-') 
       time = 2000; 
      else 
       time = 1000; 

      i++; 

      //sendVisualMessage(time); 

      if (stopWorking)break; 

      if(i>=mourseMessage.length())i=0; 
     } 

     sendToHandler(STOP_EXECUTION); 

    } 

    private void sendToHandler(int action) 
    { 
     myMessage = myHandler.obtainMessage(); 
     myBundle = new Bundle(); 
     myBundle.putInt(KEY_HANDLER_INDEX, action); 
     myBundle.putSerializable(KEY_HANDLER_COLOR, workColor); 
     myMessage.setData(myBundle); 
     myHandler.sendMessage(myMessage); 
    } 

    private void sendVisualMessage(int duration) 
    { 
     workColor = eColors.eBLACK; 
     sendToHandler(CHANGE_COLOR); 

     //myHandler.postDelayed(this, duration); 

     workColor = eColors.eWHITE; 
     sendToHandler(CHANGE_COLOR); 
    } 

    public void cancelExecution() 
    { 
     stopWorking= true; 
    } 

} 

Я знаю, что тема работает, потому что я вижу некоторый вывод в LogCat (далее»...- --... ") я получаю следующее в LogCat при аварии приложения:

02-19 21:52:28.715: I/System.out(615): ...---... 
02-19 21:52:28.715: I/System.out(615): ...---... 
02-19 21:52:28.715: I/System.out(615): ...---... 
02-19 21:52:28.715: I/System.out(615): ...---... 
02-19 21:52:28.735: W/ActivityManager(58): Force finishing activity com.izonfreak.lightadvance/.MainActivity 
02-19 21:52:28.735: I/ActivityManager(58): Killing com.izonfreak.lightadvance (pid=615): user's request 
02-19 21:52:28.735: I/Process(58): Sending signal. PID: 615 SIG: 9 
02-19 21:52:28.805: I/WindowManager(58): WIN DEATH: Window{460e7a60 Toast paused=false} 
02-19 21:52:28.815: I/WindowManager(58): WIN DEATH: Window{460a8f38 com.izonfreak.lightadvance/com.izonfreak.lightadvance.MainActivity paused=true} 
02-19 21:52:28.815: I/ActivityManager(58): Process com.izonfreak.lightadvance (pid 615) has died. 
02-19 21:52:28.865: W/InputManagerService(58): Got RemoteException sending setActive(false) notification to pid 615 uid 10037 

Так вот это .. я застрял в этой части весь день x_x.

+0

Почему вы хотите сделать это без AsyncTask? –

+0

хорошо учатся, часть у меня экзамен на следующей неделе, и это своего рода изучение, но в основном любопытство – IzonFreak

ответ

0

Вы на самом деле не создаете отдельный поток. Ваш runnable запускается непосредственно в контексте вашего основного потока. Таким образом, он сидит в жесткой петле на основной нити, и Android убивает приложение из-за ANR.

Смежные вопросы