简单的Android异步线程AsyncTask方法,Socket示例

AsyncTask异步线程简单讲解
在这里呢简单的讲一下刚刚学过的Android的异步线程,以及简单的示例:

以下就是AsyncTask的标准定义方法了,可以通过new一个对象来调用此方法,本文章仅仅讲述极为简单的方法

public abstract class AsyncTask<Params, Progress, Result>

三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。

好了知道了以上三个参数的定义我们来看一下具体的方法吧
这里就不讲解onPreExecute()方法了,它主要是用来开始doInBackground(Params… params)前对UI的操作。此方法如果不需要可以忽略

第一个是doInBackground(Params… params),在**onPreExecute()**完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress… values)来更新进度信息。

第二个是onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,接收由publishProgress传来的参数,这个方法是跨线程的。

第三,execute(Params… params),开始异步线程。

这就是最基础的异步线程方法了,另外的在异步线程的使用中还有以下几点需要特别注意:

1.异步任务的实例必须在UI线程中创建。
2.execute(Params… params)方法必须在UI线程中调用。
3.不要在doInBackground(Params… params)方法里面去更新UI
4.一个异步线程只能更新一次。

下面是自己写的绝对简单的异步线程Socket,只要学过socket相信一定能看懂,当然还需要一些Android基础,相信找到这篇文章的你们一定都具有这两个条件了吧,话不多说
直接上代码:

public class MainActivity extends AppCompatActivity {
    private Button button1,button2;
    TextView textView;
    EditText editText1,editText2,editText3;
    //创建所需要的UI控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ID();//实例化UI控件
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                connect();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                send();
            }
        });

    }
    //创建全局变量Socket,bufferedReader,bufferedWriter
    Socket socket=null;
    BufferedReader bufferedReader=null;
    BufferedWriter bufferedWriter=null;
    public void connect(){
//创建一个新的异步线程传入Void,String,VOid
        AsyncTask asyncTask =new AsyncTask() {
            @Override
            protected Void doInBackground(Void... voids) {
                try{
                    //此方法中不可以更新UI,,切记
                    //通过文本输入框来输入将要连接的IP地址以及端口
                socket =new Socket(editText2.getText().toString().trim(),Integer.parseInt(editText1.getText().toString().trim()));
               //将getXXXX包装成bufferedXXX
                 bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream()));
                bufferedWriter =new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                publishProgress("success");
                //传输字符串准备更新UI
                } catch (UnknownHostException e1) {
                    publishProgress("low");
                }catch (IOException e){
                    publishProgress("low");
                }
                try{
                //文件输入流,通过publishProgress发送
                    String data =null;
                    while((data=bufferedReader.readLine())!=null){
                        publishProgress(data);
                    }
                }catch (IOException e){
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(String... values) {
                if(values[0].equals("success"))
                //如果传进来的参数与success相匹配则弹出连接成功的提示
                {
                    Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();

                }
                if(values[0].equals("low"))
                {
                    Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                }
                //通过传来的信息展示在UI控件上
                textView.append("别人说:"+values[0]+"\n");
                super.onProgressUpdate(values);
            }
        };
        //启动异步线程
        asyncTask.execute();
    }
    public void send(){
        try {
            //更新UI以及文件输出流
            textView.append("我说:"+editText3.getText().toString().trim()+"\n");
//            bufferedWriter.write(Data, 0, Data.length());
            bufferedWriter.write(


                    editText3.getText().toString().trim()+"\n");
            bufferedWriter.flush();
            editText3.setText(" ");

        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public  void ID(){
        //实例化控件
        button1 =(Button)findViewById(R.id.connect);
        button2=(Button)findViewById(R.id.send);
        textView =(TextView)findViewById(R.id.tv);
        editText1 =(EditText)findViewById(R.id.com);
        editText2=(EditText)findViewById(R.id.ip);
        editText3=(EditText)findViewById(R.id.editText);
    }
}

布局文件也粘上叭

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="58dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textView"
        android:layout_width="44dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="IP:"
        android:gravity="center_horizontal"/>

    <EditText
        android:id="@+id/ip"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:ems="10"
        android:inputType="textPersonName" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="62dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="端口号"
        android:gravity="center_horizontal"/>

    <EditText
        android:id="@+id/com"
        android:layout_width="wrap_content"
        android:layout_height="72dp"
        android:layout_weight="1"
        android:ems="10"
        android:inputType="textPersonName" />
</LinearLayout>

<Button
    android:id="@+id/connect"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="连接" />

<TextView
    android:id="@+id/tv"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0.85" />

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<Button
    android:id="@+id/send"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="发送" />

Dome:Socket 异步

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值