簡體   English   中英

Android網絡和線程

[英]Android Networking and Threading

我有一個只包含用於各種數據庫查詢的靜態函數的類。 由於它們都是與網絡相關的,因此我需要在另一個線程中執行該代碼。 我正在嘗試找到實現此目的的最佳方法。

public class MyClass {

    public static void someFunction() {
        ...
    }

    public static void anotherFunction() {
        ...
    }

}

我正在考慮這樣做:

public class MyClass {

    public static void someFunction() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                ...
            }
        }
    }

    public static void anotherFunction() {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                ...
            }
        }
    }

}

或在調用這些函數時創建一個新線程:

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        MyClass.someFunction();
    }
}

new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        MyClass.anotherFunction();
    }
}

最后,我想知道是否有一種方法可以與主線程並行運行一個單獨處理這些函數調用的線程。 主線程將調用這些函數,而另一個線程將運行它們。

是否有人對實現此目標的最佳方法有任何想法? 謝謝!

標准Java並發實用程序將最適合這種情況。

例如:

private static final ExecutorService exe = Executors.newSingleThreadExecutor();
...
exe.execute(new Runnable() {
    public void run() {
        ...
        someFunction();
        ...
    }
});

了解有關ExecutorService ExecutorService允許您根據需要管理線程。 如果希望線程按順序生成,則可以簡單地使用ExecutorService ex = Executors.newSingleThreadExecutor()然后將所有線程添加到此executorService中。

ex.submit(runnableInstance)

但是,您遇到的問題也完全一樣。 我還使用線程從數據庫查詢。 但是,這使我的代碼看起來很凌亂。 如果它們涉及簡單的操作,我建議您在主線程中使用查詢。 它幾乎不會給應用程序響應帶來任何延遲。 這樣,您的代碼將非常易於管理。

編輯:

很久以前,我還了解了CursorLoader類,該類允許您在后台運行查詢,並且可以通過實現LoaderManager.LoaderCallbacks<Cursor>來使用。 這樣,您不必編寫丑陋的代碼即可在后台執行每個查詢。 但是,要使用此功能,您需要將數據庫包裝在ContentProvider

我相信最適合您的解決方案是使用IntentService

從android doc提取

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time. 

您只需要處理onHandleIntent

它為您做了很多工作,並且由於它是服務的子類,因此您可以直接綁定到服務或通過其他方式(Intent..etc)綁定到服務以獲取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM