首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理这个线程?

如何处理这个线程?
EN

Stack Overflow用户
提问于 2011-11-10 17:30:56
回答 2查看 1.3K关注 0票数 0

在我的应用程序中,当活动A被调用时,有一个线程正在运行。现在,我将转到另一个活动B,但不对该线程执行任何操作。还有关于活动B的另一个线程。现在,在完成活动B的活动之后,我返回到活动A。

当时我得到了一个错误,活动A上的线程已经在运行了。那么,我应该做些什么来处理这个错误呢?每次当我从活动B返回到A时,我的应用程序崩溃。

谢谢。

在这个错误日志绘图图面中是我的活动A,如上所述。错误日志:

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
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...
        }
    }
}

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-10 17:49:23

如果您使用AsyncTask,它们将在您离开某个活动后自动关闭,而不是使用ThreadRunnable

或者,如果您只想使用Thread,那么在离开该活动之前,您必须使用t.interrupt()来停止任何正在运行的Thread t

因此,我猜将t.interrupt()放在活动的onPause()方法中以停止Thread

编辑:此行是冗余的

代码语言:javascript
运行
复制
if(!thread.isAlive())            
             thread.start();  

我不明白你想要做什么,

代码语言:javascript
运行
复制
thread.setRunning(true);

这可能会产生一些问题,请删除此内容,然后重试

也就是说,试试这个

代码语言:javascript
运行
复制
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
        thread.start(); // error at this line 
}
票数 1
EN

Stack Overflow用户

发布于 2011-11-10 18:13:10

这将不起作用(大多数情况下是->竞争条件):

代码语言:javascript
运行
复制
   thread.start(); // error at this line
   if(!thread.isAlive()) thread.start();

别干那事。一个线程只能启动一次,而且肯定有,没有理由重试启动它。

thread.start();确实是启动线程所需的全部。

编辑:

代码语言:javascript
运行
复制
while (retry) {
  thread.join();
  retry = false;
}

没有任何意义。只需join(),并可能将中断转发到您的thread

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8077407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档