Как справиться с этой темой? - PullRequest
0 голосов
/ 10 ноября 2011

В моем приложении есть один поток, работающий в действии А, пока это вызов.Теперь я иду к другому занятию B, ничего не делая с этим потоком.Есть также еще один поток в действии B. Теперь после завершения действия в действии B. Я возвращаюсь к действию A.

В то время я получил ошибку, что поток в действии A уже запущен.Итак, что я должен сделать, чтобы справиться с этой ошибкой ???Каждый раз, когда происходит сбой моего приложения, когда я возвращаюсь из действия B к A.

Спасибо.

В этом журнале ошибок поверхность рисования - это мое действие A, как сказано выше.Журнал ошибок:

11-10 15:08:24.730: ERROR/AndroidRuntime(1145): FATAL EXCEPTION: main
11-10 15:08:24.730: ERROR/AndroidRuntime(1145): java.lang.IllegalThreadStateException: Thread already started.
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at java.lang.Thread.start(Thread.java:1322)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at com.example.drawing.DrawingSurface.surfaceCreated(DrawingSurface.java:113)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.SurfaceView.updateWindow(SurfaceView.java:532)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.View.dispatchWindowVisibilityChanged(View.java:3891)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:719)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:719)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:719)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:719)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewRoot.performTraversals(ViewRoot.java:744)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.os.Looper.loop(Looper.java:123)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at java.lang.reflect.Method.invokeNative(Native Method)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at java.lang.reflect.Method.invoke(Method.java:521)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-10 15:08:24.730: ERROR/AndroidRuntime(1145):     at dalvik.system.NativeStart.main(Native Method)

Класс DrawingSurface, где я получил Ошибка:

public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback {
private Boolean _run;
protected DrawThread thread;
public Canvas canvas = null;
private CommandManager commandManager;
//private Bitmap myBitmap;
private Bitmap mBitmap;

public DrawingSurface(Context context, AttributeSet attrs) {
    super(context, attrs);

    getHolder().addCallback(this);

    commandManager = new CommandManager();
    thread = new DrawThread(getHolder());
}

class DrawThread extends Thread{
    private SurfaceHolder mSurfaceHolder;

    public DrawThread(SurfaceHolder surfaceHolder){
        mSurfaceHolder = surfaceHolder;

    }

    public void setRunning(boolean run) {
        _run = run;
    }

    @Override
    public void run() {
        //Canvas canvas = null;
        while (_run){

            try{
                canvas = mSurfaceHolder.lockCanvas(null);
                if(mBitmap == null){
                    mBitmap =  Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);
                }

                final Canvas c = new Canvas (mBitmap);
                //canvas.drawColor(0, PorterDuff.Mode.CLEAR);
                c.drawColor(0, PorterDuff.Mode.CLEAR);
                canvas.drawColor(Color.WHITE); 
//             Bitmap kangoo =   BitmapFactory.decodeResource(getResources(),R.drawable.icon);

                if(!(DrawingActivity.imagePath==null)){
                    c.drawBitmap(DrawingActivity.mBitmap, 0, 0, null);
                }
                commandManager.executeAll(c);
                canvas.drawBitmap (mBitmap, 0,  0,null);
            } finally {

                mSurfaceHolder.unlockCanvasAndPost(canvas);
            }
        }

    }
}


public void addDrawingPath (DrawingPath drawingPath){
    commandManager.addCommand(drawingPath);
}

public boolean hasMoreRedo(){
    return commandManager.hasMoreRedo();
}

public void redo(){
    commandManager.redo();
}

public void undo(){
    commandManager.undo();
}

public boolean hasMoreUndo(){
    return commandManager.hasMoreRedo();
}

public Bitmap getBitmap(){
    return mBitmap;
}


public void surfaceChanged(SurfaceHolder holder, int format, int width,  int height) {
    // TODO Auto-generated method stub
    mBitmap =  Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888);;
}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
        thread.setRunning(true);
        thread.start(); // error at this line
        if(!thread.isAlive())            
             thread.start();  
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    boolean retry = true;
    thread.setRunning(false);
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {
            // we will try it again and again...
        }
    }
}

}

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Вместо использования Thread и Runnable, если вы выберете AsyncTask, они автоматически закроются после того, как вы отойдете от действия.

или, если вы хотите использовать только Thread, вам придется использовать t.interrupt(), чтобы остановить любой запуск Thread t, прежде чем отойти от действия.

так что, я полагаю, поместите t.interrupt() в onPause() метод действия, чтобы остановить Thread

Редактировать: эта строка избыточна

if(!thread.isAlive())            
             thread.start();  

и я не понимаю, что вы пытаетесь сделать с этим,

thread.setRunning(true);

возможно, это создает проблемы, удалите это и попробуйте снова

т.е. попробуйте это

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
        thread.start(); // error at this line 
}
0 голосов
/ 10 ноября 2011

Это не сработает (большую часть времени -> состояние гонки):

   thread.start(); // error at this line
   if(!thread.isAlive()) thread.start();

Не делайте этого.Поток может быть запущен только один раз , и определенно нет причин для повторной попытки его запуска.

thread.start(); - это действительно все, что вам когда-либо понадобится для запусканить.

РЕДАКТИРОВАТЬ:

while (retry) {
  thread.join();
  retry = false;
}

не имеет никакого смысла.Просто join() и, возможно, передайте прерывание на ваш thread.

...