0.前言

在MainThread , Android 不希望做一些耗時工作 例如:Download , Load json data … 這些 , 解決方式就是用 AsyncTask非同步執行

1.準備

口訣: AsyncTask<你要傳入的值 parameter1,你要他在中間執行時給你資訊值parameter2,結果值parameter3>

parameter1 這個參數是傳入 doInBackground(parameter1 (array) , 取得parameter1 ,他在陣列中的 0

parameter2 需要在doInBackground 呼叫 publishProgress(parameter2) 才會到 onProgressUpdate(parameter2(array))

parameter3 值是依據 doInBackground 所 return 的值 為準 結果會出現在 onPostExecute(parameter3)

2.Code

此範例讀取 yahoo 上的 html

publishProgress  能搭配 progressbar 進度條

 

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String link = "https://tw.yahoo.com/";
        new YahooTask().execute(link);

    }

    class YahooTask extends AsyncTask<String,Integer,String>{

        @Override
        protected String doInBackground(String... strings) {
            Log.d(TAG, "doInBackground: "+strings[0]);
            StringBuilder stringBuilder = null;
            try {
                URL url = new URL(strings[0]);
                InputStream in = url.openStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                String line = br.readLine();
                stringBuilder = new StringBuilder();
                while (line != null) {
                    Log.d(TAG, "doInBackground: "+line);
                    stringBuilder.append(line);
                    line = br.readLine();
                    publishProgress(10);
                }
                publishProgress(100);
                //Log.d(TAG, "onCreate: "+stringBuilder.toString());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(stringBuilder.length()==0)return "without data";
            return stringBuilder.toString();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Log.d(TAG, "onProgressUpdate: "+values[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.d(TAG, "onPostExecute: "+s);
        }
    }
}

3.Result

4.Git

https://github.com/encorex32268/blogthing/tree/master/TestAsync

 

 

最後修改日期: 2019-05-16 17:42:05

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料