1

Threadクラスを継承するクラスに次のメソッドを記述しました。

protected File createFile(String fileName){
        try {
            File file = new File(fileName);
            if(!file.exists())
                file.createNewFile();
            else{
                file.delete();
                file.createNewFile();
            }
            file.mkdirs();
            return file;
        }catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

スレッドがすでに開始されると、アクティビティから呼び出されます。アクティビティからこれを行う場合:

File logFile = mThread.createFile("/Logs/test.txt");
if(logFile!=null)
//do something
else
//do something else

ファイルが作成されるまでブロックされますか?

4

2 に答える 2

1

はい、ブロックされます。

重要なのは、メソッドが呼び出されたクラスではなく、メソッドが呼び出されrun()たスレッドのメソッドです。可能性が高い

File logFile = mThread.createFile("/Logs/test.txt");
if(logFile!=null)
//do something
else
//do something else

はアクティビティrunメソッド(androidによって処理されます)から呼び出され、別のスレッドクラスからメソッドを直接呼び出すと、魔法によってこのスレッドがこのメソッドを実行することはありません。

このcreateFileメソッドでアクティビティをブロックしないようにするには、メッセージパッシングメカニズムを使用して、非アクティビティスレッドcreateFileのメソッド内で呼び出されるようにする必要があります。run()

スレッド間でメッセージを渡す方法については、この投稿のような例を参照してください。アクティビティスレッドを要約すると、他のスレッドから変数が設定されます。このスレッドは定期的にこの変数をチェックし、それに応じてアクションを実行します。これが主なアイデアですが、スレッドセーフやこれらの場合に発生するその他の問題については、Web上でこれについて読むべきことがたくさんあります。

于 2012-08-29T09:40:27.953 に答える
0

あなたActivityは、UIスレッドでAndroidによって呼び出されるコールバックメソッドのセットです。これらのコールバックは、Activity(ドキュメントで詳細に説明されているように)のライフサイクル中に実行されます。1つのコールバックが実行されている間、他のUI関連のコールバックは実行されません。

いずれかのコールバックに時間がかかると、UIが応答を停止します(これは「UIがブロックされている」と呼ばれることがよくあります)。

実際の質問に答えるには:はい、UIスレッドは、メソッドの呼び出しを含め、コールバックが完了するのを待っている間、他のイベントの処理を停止しますcreateFile

私はここで(質問から明らかではないので)への呼び出しがライフサイクルコールバックメソッドcreateFileの1つ(のような)またはに関連するUIイベントコールバック(のに接続されているような)にあると仮定しています。ActivityonCreateActivityOnClickListenerButtonActivity


ファイルの作成中にUIスレッドを保持したくない場合はcreateFile、別の「バックグラウンド」スレッドからの呼び出しを実行する必要があります。

「バックグラウンド」スレッドからUIを更新する必要がある場合は、AndroidUIAPIへの呼び出しをUIスレッドに戻すようにスケジュールする必要があることに注意してください

これは、オブジェクトを使用して実行できますThreadHandlerAsyncTaskバックグラウンドタスクとUIの更新のために適切なスレッドで呼び出されるメソッドの便利なフレームワークを提供するため、多くの場合、を使用する方が便利です。

于 2012-08-29T18:04:03.250 に答える