簡體   English   中英

AsyncTask-我使用的對嗎?

[英]AsyncTask - Am I using it right?

我正在編寫一個Android應用,該應用顯示來自網絡的隨機JPG圖像。 如果按下按鈕,則該應用會將GET請求發送到http://imgur.com/random ,然后從服務器的響應中將URL保存為JPG圖像的String(請參見代碼)。

我使用StrictMode.setThreadPolicy使它可以工作,但是我不能使用AsyncTask來做到這一點。

我試圖將.JPG地址的提取放入doInBackground中 ,並將更改圖像的實際過程放入onPostExecute中 ,如下所示:

public class MainActivity extends Activity {

    // Page "http://imgur.com/random" redirects users to a random page;
    // After the redirect, the URL will be something like "http://imgur.com/gallery/XXXXXX";
    // Actual image is at "http://i.imgur.com/XXXXXX.jpg"
    private final String WHERE = "http://imgur.com/random";
    private ImageExtractor ie;

    private class ATask1 extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            // Go to WHERE and get a valid URL to a random .jpg image
            ie = new ImageExtractor();
            ie.extractImageURL(WHERE);
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // Change the image in ImageView based on the new URL
            ImageView i = (ImageView)findViewById(R.id.imageDisplay);

            try {
                Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(ie.getImageURL()).getContent());
                i.setImageBitmap(bitmap); 
            } catch (Exception e) {
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // Method called when the button is pressed
    public void getNewImage(View v) {
        new ATask1().execute("");
    }
    ....
}

public class ImageExtractor {

    private final String USER_AGENT = "Mozilla/5.0";
    private String imageURL;

    public void extractImageURL(String address) {
        String returnedURL;

        try {
            // Create URL object based on passed argument
            URL url = new URL(address);

            // Send GET request
            HttpURLConnection conn = (HttpURLConnection)(url.openConnection());
            conn.setRequestMethod("GET");
            conn.setRequestProperty("User-Agent", USER_AGENT);

            // Response code of the answer
            conn.getResponseCode();

            // Create and save image URL as a string
            returnedURL = conn.getURL().toString();
            imageURL = returnedURL.replace("http://imgur.com/gallery/", "http://i.imgur.com/") + ".jpg";
        }
        catch (IOException e) {

        }
    }

    // Return image URL as a string;
    // http://i.imgur.com/XXXXXX.jpg
    public String getImageURL() {
        return imageURL;
    }
}

現在,如果我按下按鈕,則隨機.JPG的地址將正確存儲在imageURL中,但是此后什么也沒有發生。 到目前為止我做的正確嗎? 我是否需要為BitmapFactory部件創建一個新的AsyncTask / Thread或類似的東西? 應該如何實施?

謝謝你的幫助!

在我看來還可以。 只是一件事:在doInBackground()方法你返回null -請記住,這是你的參數onPostExecute()方法會收到,所以基本上String result將是無效的。 但就您而言,只要您不以錯誤的方式使用它,就可以。

回答您的問題:很難說出錯誤在哪里,但是處理AsyncTask的方式對我來說似乎是正確的。 您不需要聲明新的ThreadAsyncTask來執行extractImageURL(WHERE)作業,畢竟AsyncTask已經是一個Thread並將在后台執行。 我會考慮在您的所有AsyncTask代碼中放置幾個Log.d()實例,以查看錯誤在哪里,但是就結構而言,它似乎沒有任何問題。

您已經有了一般概念,但對此感到好奇:

Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(ie.getImageURL()).getContent());

您正在UI線程上的onPostExecute中執行此操作,這看起來非常像網絡請求。 較新版本的Android將完全拒絕這樣做,並拋出NetworkOnMainThreadException 您似乎唯一要做的就是請求獲取圖像路徑的請求。

暫無
暫無

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

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