16

バックグラウンド計算を実行するために使用AsyncTaskしていますが、例外を処理する正しい方法を見つけることができません。現在、次のコードを使用しています。

private class MyTask extends AsyncTask<String, Void, String>
{
    private int e = 0;

    @Override
    protected String doInBackground(String... params)
    {
        try
        {
            URL url = new URL("http://www.example.com/");
        }
        catch (MalformedURLException e)
        {
            e = 1;
        }

        // Other code here...

        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {
        if (e == 1)
            Log.i("Some Tag", "An error occurred.");

        // Perform post processing here...
    }
}

変数 e は、メイン スレッドとワーカー スレッドの両方で書き込み/アクセスできると思います。onPostExecute()終了後にのみ実行されることがわかっているのでdoInBackround()、同期を省略できますか?

これは悪いコードですか?で例外を処理するための合意された、または正しい方法はありAsyncTaskますか?

4

3 に答える 3

3

あなたのコードはうまくいくと思いますが、 AsyncTaskクラスには何らかのエラー処理が組み込まれています。

cancel()メソッドとそのハンドラ メソッドonCancelled()を使用すると、余分な変数の使用を避けることができます。doInBackground()メソッド内でキャンセルを呼び出すと、UI スレッドで onCancelled メソッドが呼び出されます。cancel(true) と cancel(false) のどちらを呼び出すかは、ニーズによって異なります。


private class MyTask extends AsyncTask<String, Void, String>
{    
    @Override
    protected NewsItem doInBackground(String... params)
    {
        try
        {
            URL url = new URL("http://www.example.com/");
        }
        catch (MalformedURLException e)
        {
            cancel(false/true);  
        }

        // Other code here...

        return null;
    }

    @Override
    protected void onPostExecute(String result)
    {              
        // Perform successful post processing here...
    }

   @Override
    protected void onCancelled() {
        super.onCancelled();
        // Perform error post processing here...
    }
}
于 2010-09-12T11:36:53.153 に答える
3

私は自分のアプリでそれを行ってきましたが、より良い方法はないと思います。

それについてのマーク・マーフィーの回答も読むことができます。

于 2010-09-11T12:33:39.497 に答える
2

これは、SMP アーキテクチャーでも動作することが保証されています。すべての同期が自動的に行われます。ただし、これを行うには戻り値を使用する方がよいでしょう。

于 2010-09-11T18:50:29.543 に答える