美文网首页
AsyncTask使用

AsyncTask使用

作者: 小马要加油 | 来源:发表于2019-01-25 11:06 被阅读0次

小场景

hi,今天有个小功能,需要ping<ip>,我就google了一下,就找到了一个工具类,然后我就加工了一下。

        String resault = "";
        Process p;
        try {
            p = Runtime.getRuntime().exec("ping  " + str);
            int status = p.waitFor();
            InputStream input = p.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(input));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = in.readLine()) != null){
                buffer.append(line+"\n");
            }
            Log.d("Return ============" ,buffer.toString());

            if (status == 0) {
                resault = "success";
            } else {
                resault = "faild";
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return resault;
    }

那我该怎么用呢?考虑到这个是一个耗时操作,我就想到了AsyncTask,先看一个刚入门Android的笔记吧。
http://note.youdao.com/noteshare?id=a640bf4dff6df5712c00318dcfadfc74&sub=E8B32F6E92F844E88284B409FAA17B18

使用

第一,继承AsyncTack

        //在子线程运行,执行加载,不能更新UI
        @Override
        protected String doInBackground(String... params) {
            Log.d(TAG, "doInBackground: ping");
            //执行这个才会调用onPregressUpdate去更新UI,要放到耗时长的方法前面
            publishProgress("pinging...");
            String s = "";
            s = PingUtil.Ping(params[0]);
            Log.d("ping", s);
            return s;
        }

        //执行后台任务时更新UI
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            Log.d(TAG, "onProgressUpdate: ping "+values[0]);
            mPingPref.setSummary(values[0]);
        }
        //任务执行后的回调
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Log.d(TAG, "onPostExecute:ping  "+s);
            mPingPref.setSummary(s);
        }
        //任务被取消的回调
        @Override
        protected void onCancelled() {
            super.onCancelled();
            Log.d(TAG, "onCancelled: ping");
            mPingPref.setSummary("");
        }
    }

安全方法

未防止内存泄漏,第一 AsyncTask设置为静态类
第二,在Activity生命结束前,若任务还没有执行完,将任务cancel掉。

    protected void onDestroy() {
        super.onDestroy();
        if (mNetPing!=null && !mNetPing.isCancelled()){
            mNetPing.cancel(true);
        }
    }

碎碎念

就这样啦,如果这里有不妥之处,请指出,大家一起进步,gogogo。

相关文章

网友评论

      本文标题:AsyncTask使用

      本文链接:https://www.haomeiwen.com/subject/jpcmjqtx.html