Android-AsyncTask異步任務(wù)

AsyncTask介紹
Android的AsyncTask比Handler更輕量級(jí)一些,適用于簡(jiǎn)單的異步處理。
首先明確Android之所以有Handler和AsyncTask,都是為了不阻塞主線程(UI線程),且UI的更新只能在主線程中完成,因此異步處理是不可避免的。

Android為了降低這個(gè)開發(fā)難度,提供了AsyncTask。AsyncTask就是一個(gè)封裝過的后臺(tái)任務(wù)類,顧名思義就是異步任務(wù)。

AsyncTask直接繼承于Object類,位置為android.os.AsyncTask。要使用AsyncTask工作我們要提供三個(gè)泛型參數(shù),并重載幾個(gè)方法(至少重載一個(gè))。

AsyncTask定義了三種泛型類型 Params,Progress和Result。

Params 啟動(dòng)任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請(qǐng)求的URL。
Progress 后臺(tái)任務(wù)執(zhí)行的百分比。
Result 后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String。
使用過AsyncTask 的同學(xué)都知道一個(gè)異步加載數(shù)據(jù)最少要重寫以下這兩個(gè)方法:

1.doInBackground(Params…) 后臺(tái)執(zhí)行,比較耗時(shí)的操作都可以放在這里。注意這里不能直接操作UI。此方法在后臺(tái)線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長(zhǎng)的時(shí)間。在執(zhí)行過程中可以調(diào)用publicProgress(Progress…)來更新任務(wù)的進(jìn)度。
2.onPostExecute(Result) 相當(dāng)于Handler 處理UI的方式,在這面可以使用在doInBackground 得到的結(jié)果處理操作UI。 此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回
有必要的話你還得重寫以下這三個(gè)方法,但不是必須的:

onProgressUpdate(Progress…) 可以使用進(jìn)度條增加用戶體驗(yàn)度。 此方法在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進(jìn)度。
onPreExecute() 這里是最終用戶調(diào)用Excute時(shí)的接口,當(dāng)任務(wù)執(zhí)行之前開始調(diào)用此方法,可以在這里顯示進(jìn)度對(duì)話框。
onCancelled() 用戶調(diào)用取消時(shí),要做的操作
使用AsyncTask類,以下是幾條必須遵守的準(zhǔn)則:

Task的實(shí)例必須在UI thread中創(chuàng)建;
execute方法必須在UI thread中調(diào)用;
不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法;
該task只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常;
MainActivity.java

package ghw.com.usingasynctask;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {

    TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.textView);
        findViewById(R.id.read).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ReadURL("http://www.pku.edu.cn/");
            }
        });
    }

    public void ReadURL(String url) {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    URL url = new URL(params[0]);
                    URLConnection connection = url.openConnection();
                    InputStream iStream = connection.getInputStream();
                    InputStreamReader isr = new InputStreamReader(iStream);
                    BufferedReader br = new BufferedReader(isr);
                    String line;
                    StringBuilder builder = new StringBuilder();
                    while ((line = br.readLine()) != null) {
                        builder.append(line);
                    }
                    br.close();
                    iStream.close();
                    return builder.toString();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPreExecute() {
                Toast.makeText(MainActivity.this, "開始讀取", Toast.LENGTH_SHORT).show();
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String s) {
                Toast.makeText(MainActivity.this, "讀取完成", Toast.LENGTH_SHORT).show();
                text.setText(s);
                super.onPostExecute(s);
            }

            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled(String s) {
                super.onCancelled(s);
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();
            }
        }.execute(url);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ghw.com.usingasynctask.MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="16dp" />
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        tools:layout_editor_absoluteX="154dp"
        tools:layout_editor_absoluteY="128dp" />
    </ScrollView>

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ghw.com.usingasynctask">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Android Studio添加網(wǎng)絡(luò)權(quán)限
使用Android Studio添加用戶網(wǎng)絡(luò)權(quán)限的時(shí)候和ADT的可視化添加是不同的,具體做法是在AndroidManifest文件中添加一行代碼,添加的地方如圖:

Android Studio添加網(wǎng)絡(luò)權(quán)限

程序運(yùn)行圖片

程序運(yùn)行圖片1
程序運(yùn)行圖片2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,922評(píng)論 25 709
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 3,419評(píng)論 1 15
  • 在Android中我們可以通過Thread+Handler實(shí)現(xiàn)多線程通信,一種經(jīng)典的使用場(chǎng)景是:在新線程中進(jìn)行耗時(shí)...
    呂侯爺閱讀 2,167評(píng)論 2 23
  • AsyncTask 1.簡(jiǎn)介 AsyncTask允許你執(zhí)行后臺(tái)耗時(shí)操作,并將結(jié)果發(fā)布到UI線程。整個(gè)實(shí)現(xiàn)過程不需要...
    chewbee閱讀 1,498評(píng)論 0 1
  • 夏日的陽(yáng)光總是刺眼,就像心里永遠(yuǎn)有根刺,所以才會(huì)讓自己狼狽不堪。 地上灑滿小小的桂花,有風(fēng)襲過,還能聞到那若有似無(wú)...
    大天使早就死掉了閱讀 769評(píng)論 2 7

友情鏈接更多精彩內(nèi)容