2011-11-09 28 views
0

我知道停止方法已被弃用,我现在使用的破坏方法,但是我得到这个错误:android如何停止或销毁一个线程?

11-09 11:42:28.740: E/AndroidRuntime(1538): FATAL EXCEPTION: main 
11-09 11:42:28.740: E/AndroidRuntime(1538): java.lang.NoSuchMethodError: Thread.destroy() 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at java.lang.Thread.destroy(Thread.java:600) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at com.rathbones.src.NewslettersActivity.onKeyDown(NewslettersActivity.java:144) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.view.KeyEvent.dispatch(KeyEvent.java:1037) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.app.Activity.dispatchKeyEvent(Activity.java:2068) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1735) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.os.Looper.loop(Looper.java:123) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-09 11:42:28.740: E/AndroidRuntime(1538):  at dalvik.system.NativeStart.main(Native Method) 
11-09 11:42:28.760: W/ActivityManager(59): Force finishing activity com.rathbones.src/.NewslettersActivity 

但应用程序没有崩溃,它只是我得到了logcat的这个错误。 其实我有一个时事通讯模块,它使用户能够查看PDF文件,当他们按下视图按钮时,它打开一个进度条,并在同一时间,如果有人按下后按钮,它应该停止线程并优雅地退出。它这样做,但在日志猫我得到上述错误。这是导致此错误的代码片段:

private void viewOnline() { 

     if (currentNewsletter == null) { 
      Log.e(Constants.APP_NAME, "No newsletter selected"); 
      return; 
     } 

     final ProgressDialog d = new ProgressDialog(this); 
     d.setMessage("Downloading..."); 
     d.show(); 

     final Context context = getApplicationContext(); 
     t = new Thread(new Runnable() { 
      public void run() { 

       String fileName = currentNewsletter.mFilename; 

       Log.d(Constants.APP_NAME, "Downloading/showing: " + fileName); 
       final File file = Utilities.getFileFromURL(context, currentNewsletter.mUrl, currentNewsletter.mExpectedSizeInBytes, fileName, false); 

       d.dismiss(); 
       // Now we can show the file 
       viewPDF(file); 
      } 
     }); 
     t.start(); 

     // Utilities.List(getApplicationContext().getFilesDir().getPath()); 
     // Utilities.List(getApplicationContext().getDir("files", Context.MODE_WORLD_WRITEABLE).getAbsolutePath()); 
     // Utilities.DeleteDirectory(getApplicationContext().getDir("files", Context.MODE_WORLD_WRITEABLE).getAbsolutePath()); 

    } 

    private void viewPDF(File file) { 

     //DEBUG DEBUG DEBUG 
     //Log.d(Constants.APP_NAME, "ViewPDF: showing " + file.getName()); 
     //Log.d(Constants.APP_NAME, "Path: " + file.getPath()); 
     //Log.d(Constants.APP_NAME, "Exists: " + file.exists()); 
     //Log.d(Constants.APP_NAME, "Length: " + file.length()); 
     //DEBUG DEBUG DEBUG 

     // Now it's all safe and sound and local, open it 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(file), "application/pdf"); 

     try { 
      startActivity(intent); 
     } catch (Exception e) { 
      Toast.makeText(this, "No Application Available to View PDF", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    protected void onStop() { 
     finish(); 
     super.onStop(); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
      t.destroy(); 
      Intent i = new Intent(NewslettersActivity.this,MainMenuActivity.class); 

      startActivity(i); 
      finish(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
+0

销毁也被弃用。请点击此链接:http://developer.android.com/reference/java/lang/Thread.html#destroy%28%29 –

+0

@VineetShukla谢谢你让我知道。 – Maverick

回答

3

如果你有一个while loop里面的线程,你可以通过boolean flag来控制这个线程的while条件。当您设置flag to false时,线程刚刚完成其任务

编辑:小例子,

boolean flag = true; 
Thread secondary = new Thread(new Runnable() { 

@Override 
public void run() { 
    while (flag) { 
    // do something 
    } 
} 
}); 

secondary.start(); //start the thread 
flag = false; // this will force secondary to finish its execution 
try { 
    secondary.join(); // wait for secondary to finish 
    } catch (InterruptedException e) { 
    throw new RuntimeException(e); 
} 

我会发现这个代码SO,它也为我工作。

+0

请你更详细地告诉我。 – Maverick

+0

好..它看起来是一个非常合理的解决方案..只是现在就尝试它..并会让你知道 – Maverick

+0

nope..its不工作..它崩溃的应用程序 – Maverick

1

使用中断而不是销毁。

+0

没有..给错误。实际上导致应用程序崩溃。 – Maverick

+0

然后按照这个:http://stackoverflow.com/questions/5241822/is-it-good-way-to-stop-java-thread-forcefully/5241925#5241925 –

0

到user370305答案,也许2点的变化可以帮助:

1)使用AtomicBoolean代替布尔值,如果线程在另一个核上运行,变化不能作为标志可见。

2)删除catch中的throw new RuntimeException(e)。它会在您抛出异常时崩溃。