Android 如何处理这个线程?
在我的应用程序中,在调用活动时,有一个线程在活动中运行。现在我将进入另一个活动B,对该线程不做任何操作。 活动B上还有另一个线程。 现在,在完成活动B的活动后,我回到活动A 当时我得到一个错误,即活动A上的线程已经在运行。 那么,我应该如何处理这个错误??? 每次我从活动B返回A时,我的应用程序都会崩溃 谢谢 在此错误日志中,绘图面是我的活动A,如上所述。 错误日志:Android 如何处理这个线程?,android,multithreading,android-layout,android-emulator,android-widget,Android,Multithreading,Android Layout,Android Emulator,Android Widget,在我的应用程序中,在调用活动时,有一个线程在活动中运行。现在我将进入另一个活动B,对该线程不做任何操作。 活动B上还有另一个线程。 现在,在完成活动B的活动后,我回到活动A 当时我得到一个错误,即活动A上的线程已经在运行。 那么,我应该如何处理这个错误??? 每次我从活动B返回A时,我的应用程序都会崩溃 谢谢 在此错误日志中,绘图面是我的活动A,如上所述。 错误日志: 11-10 15:08:24.730: ERROR/AndroidRuntime(1145): FATAL EXCEPTION:
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...
}
}
}
}
如果使用
AsyncTask
,而不是使用Thread
和Runnable
,它们将在您离开活动后自动关闭
或者,如果只想使用线程
,则必须使用t.interrupt()
停止任何正在运行的线程
t
,然后才能离开活动
因此,我想在活动的onPause()
方法中放入t.interrupt()
,以停止线程
编辑:该行已重新卸载
if(!thread.isAlive())
thread.start();
我不明白你想用这个做什么
thread.setRunning(true);
这可能会造成一些问题。请删除此项,然后重试
i、 试试这个
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
thread.start(); // error at this line
}
这将不起作用(大部分时间->比赛条件):
不要那样做。一个线程只能启动一次,并且肯定没有理由重新启动它
thread.start()代码>实际上是启动线程所需的全部内容
编辑:
没有任何意义。只需join()
,并可能将中断转发到您的线程
发布一些代码和错误日志。您在哪些活动方法中启动线程运行?请发布线程代码,说明您是如何实现线程的。在我的应用程序中,我正在运行线程以在画布上绘制。从那里,如果我调用另一个活动,然后返回,在那个时候我得到了错误。我正要上传错误日志。只要看一下错误日志并告诉我。我会把那个密码。嗯。。让我仔细看看我已经编辑了我的答案,在包含此视图的活动的onPause()中使用thread.interrupt()试试,检查它是否解决了问题OK。让我检查一下。如果您更新了答案,请告诉我。您可能是对的,但我正在使用该代码在画布上绘制。这就是我使用它的原因。现在如何解决这个问题呢?如果我评论说它不起作用。我被难住了,试试这个,当用户导航离开时完成你的活动,用FLAG_CLEAR_TOP开始活动,看看它是否起作用,我建议你开始悬赏这个OK。但即使我评论这两行,我也会犯同样的错误。现在我该怎么办?正如我说的:你不能多次启动一个线程。但是,在您的代码中,您只在构造函数中创建一个thread对象,该对象可能会多次被要求启动(),即每次执行surfaceCreated()时。您可能需要在surfaceCreated()中创建一个新线程。现在出现了什么错误?-向我们显示您编辑的代码和新的logcat。同样的错误也存在。如果我回来的话,应用程序就不能在画布上绘制了。
thread.start(); // error at this line
if(!thread.isAlive()) thread.start();
while (retry) {
thread.join();
retry = false;
}