安卓使用异步Asynctask连接网络


一、解决新线程无法更新UI组建问题的方案 
为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 
  • 使用Handler实现线程之间的通信。 
  • Activity.runOnUiThread(Runnable)。 
  • View.post(Runnable)。 
  • View.postDelayed(Runnable)。 
 
二、ANR(Application Not Responding)异常 
Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。 
 
三、AsyncTask抽象类 
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: 
  • Params:启动任务执行的输入参数的类型。 
  • Progress:后台任务完成进度值的类型。 
  • Result:后台执行任务完成后返回结果的类型。 
 
四、AsyncTask的特点 
  • 更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。 
 
五、使用AsyncTask的步骤 
 1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。 
  2.根据需要,实现AsyncTask的如下方法: 
       doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。 
       onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。 
       onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。 
       onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。 
  3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。   
 
六、使用AsyncTask时必须遵守的规则 
  • 必须在UI线程中创建AsyncTask的实例。 
  • 必须在UI线程中调用AsyncTask的execute()方法。 
  • AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。 

  • 每个AsyncTask只能被执行一次,多次调用将会引发异常。
例子:
class GetData extends AsyncTask<String,Integer,String> {

    @Override
    protected String doInBackground(String... strings) {

        String result="";
        JSONObject json=new JSONObject();
        try {
            json.put("code",1);//得到最新的版本和Apk位置
            URL url=new URL(GetIP.getIP(AboutUs.this)+"UpdateApkServlet");
            ConnectionServer connectionServer=new ConnectionServer(json,url);
            result=connectionServer.useURLConnection();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String s) {

        Message message=new Message();
        message.obj=s;
        handler.sendMessage(message);
        super.onPostExecute(s);
    }
}


猜你喜欢

转载自blog.csdn.net/qq_32400821/article/details/65702933