0

ここに初めて質問を投稿します。私の最初のアプリのプログラミングとコーディングを始めたばかりです。

fetchUpdates()メソッドを持つApplicationクラスファイルがあります。

public synchronized void fetchUpdates() {
    String[] mURLs = getURLs();
    new DownloadJSONData().execute(mURLs[0], mURLs[1]);
}

DownloadJSONDataはasyncTaskサーバーから更新を取得するものであり、onPostExecuteメソッドはサーバーからのJSON配列を使用してsqliteデータベースを更新します。

アプリのさまざまなコンポーネント(ウィジェットとアクティビティ)がこのメソッドを呼び出して、サーバーから更新を取得し、データベースを更新します。

質問:同期メソッドはUIスレッドとは別のスレッドで実行されますか?DownloadJSONDataもしそうなら、同期fetchUpdates()メソッドにコードを移動することに問題はないはずですよね?また、サーバーへの接続やサーバーからのデータのダウンロードに問題がある場合は、UIスレッドをブロックするべきではありませんか?

fetchUpdates()動機:データベースが更新されたかどうかを示すブール値を返すようにメソッドを変更しようとしています。ただし、現在(私が思うに)メソッドはのメソッドのfetchUpdates()前に終了するため、メソッドはデータベースを更新するための呼び出しを示すことができません。呼び出し後にデータベースが更新された場合、メソッドを呼び出すアプリコンポーネントの動作が異なる必要があります。asyncTaskonPostExecutefetchUpdates()DownloadJSONData()fetchUpdates()

PS私はプログラミングに慣れていないので、簡単で詳細な説明が本当に役に立ちます。

ありがとう!

4

2 に答える 2

6

いいえ、同期されたメソッドは同じスレッドで実行されます。ただし、他のスレッドは、実行中に(同じオブジェクトの)別の同期メソッドを実行できません。

于 2013-03-19T09:47:21.783 に答える
1

使用AsyncTaskするということは、ほとんどの場合、呼び出し元のメソッドが結果をすぐに認識しないことを意味します。呼び出しAsyncTask.get()たが、それを実行したくない場合は、非同期の側面を失う必要があります。データベースが更新されたときにユーザーにメッセージを表示したいとします。実行する必要があるのは、を開始しAsyncTask、正しいメソッドをオーバーライドしてデータベース更新の戻りステータスを処理するようにすることです。また、サーバーへのリクエストとデータベースの更新を2つの異なるタスクに分けます。

    public class CallServer extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        // Do your request to the server
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (result == SUCCESS) {
            // Display message to indicate successful request
            new UpdateDatabase().execute(params);
        } else {
            // Display error message or whatever you want to do 
        }
    }
}

public class UpdateDatabase extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        // Update the DB
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (result == SUCCESS) {
            // Display success message or whatever you want to do 
        } else {
            // Display error message or whatever you want to do 
        }
    }
}

主なアイデアはAsyncTask、呼び出し元ではなく、エラー/成功のケースを処理する必要があるということです。

于 2013-03-19T09:56:21.850 に答える