[android] 如何將多個原始參數傳遞給AsyncTask?



Answers

另一種方法:您只需要在MyTask類中添加MyTask構造函數:

private class MyTask extends AsyncTask<String, Void, Void> {
    int foo;
    long bar;
    double arple;

    MyTask(int foo, long bar, double arple) { 
         // list all the parameters like in normal class define
        this.foo = foo;
        this.bar = bar;
        this.arple = arple;
    }
    ......   // Here is doInBackground etc. as you did before
}

然後打電話

new MyTask(int foo, long bar, double arple).execute();

第二種方式,如David Wasser的答案。

Question

有相關的問題,例如如何將2個參數傳遞給AsyncTask類? ,但是我遇到了徒勞地嘗試將多個原語作為參數傳遞給AsyncTask的困難,所以我想分享我發現的內容。 在現有的問題和答案中沒有捕捉到這種微妙之處,所以我想幫助那些遇到與我一樣的問題的人,並為他們省去痛苦。

問題是:我有多個原始參數(例如兩個long)我想傳遞給AsyncTask以在後台執行 - 它怎麼能完成? (我的回答......經過一段時間的掙扎......可以在下面找到。)




這是通過子類化來解決的。 谷歌在官方的Android AsyncTask文檔中有一個解決這個問題(子類)的例子:

http://developer.android.com/reference/android/os/AsyncTask.html

例:

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));
                 // Escape early if cancel() is called
            if (isCancelled()) break;
        }
        return totalSize;
    }

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

    protected void onPostExecute(Long result) {
        showDialog("Downloaded " + result + " bytes");
    }
}



我喜歡malajisi的方法,但如果你沒有,你不能使用Bundle類嗎?

 Bundle myBundle = new Bundle();
 myBundle.putInt("foo", foo);
 myBundle.putLong("bar", bar);
 myBundle.putDouble("arple", arple);

然後只需傳遞捆綁包並將其解壓縮到MyTask中。 這是一個糟糕的主意嗎? 您可以避免創建自定義類,如果您決定稍後需要傳遞其他參數,則它很靈活。




Links