2

私は自分のAndroidアプリケーションでいくつかの重い計算を行っています。UIスレッドをブロックしたくないので、スレッドを拡張する別のWorkerThreadで計算を行います。これは正常に機能します。しかし、スレッドを停止するのに問題があります。スレッドを停止する通常の方法は、interrupt()またはvolatile変数を使用して、スレッドに終了するように指示することです。ただし、これはある種のループを持つスレッドでのみ機能します。外部ライブラリを使用してスレッドで計算を行っていますが、isInterrupted()-checkをこのライブラリに入れることができません。スレッドを停止する悪い方法は、stop()-Methodeを使用することです。これは非推奨ですが、私の場合、スレッドは内部値のみを操作するため、正しい方法です。残念ながら、Androidは非推奨のスレッドメソッドをサポートしていないため、stop()をサポートしていません。

10-18 10:26:39.382: ERROR/global(13919): Deprecated Thread methods are not supported.
10-18 10:26:39.382: ERROR/global(13919): java.lang.UnsupportedOperationException

Androidでスレッドを停止する他の方法はありますか?前もって感謝します!トビアス

PS:問題を示すいくつかのコード:

public void method()
{
    WorkerThread t = new WorkerThread();
    t.start();
    synchronized (this)
    {
        try
        {
            wait(1000);
        } catch (InterruptedException e)
        {
            Log.e("",e.toString(),e);
        }    
    }

    //t.stop(); //not supported in android
    //t.interrupt(); //can not be checked by the thread    
}

class WorkerThread extends Thread
{
    public void run()
    {
        externalLibrary.heavyComputation();
    }
}
4

2 に答える 2

0

を見てくださいAsyncTask。これは、バックグラウンドタスクを実装するためのより適切ではるかに快適な方法です。あなたがドキュメントで読むことができるように:

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
于 2011-07-02T07:27:32.887 に答える
0

一般に、外部ライブラリが計算を停止するためのプロトコルを提供しない限り、それを適切に停止する方法はありません。多くのよく書かれたライブラリはそのようなプロトコルを提供するので、そのAPIを見てください。interrupt()また、それは呼び出しを尊重するかもしれません。すでにチェックしているかもしれませんが、終了するまでに時間がかかる場合もあります。

于 2011-07-02T07:47:11.517 に答える