asynctask中的Android setText

use*_*568 1 android udp settext android-asynctask

我正在开发一个UDP程序,但是我在申请setText时遇到了麻烦asynctask.基本上在UDP服务器上,我只是要求输入一个端口然后服务器应该连接到localhost和端口.TextView布局中间的A显示"当前未连接",当我单击连接到端口时,我希望它更改为"已连接".但是,它没有做任何事情.我试着四处寻找,但无法找到解决方案.如果有人能帮我弄清楚会非常感激的问题.

我的线程asynctask代码:编辑:setText取出doinbackground.但是,setText仍然没有功能.

public class ServerThread extends AsyncTask<String, String, String>{
    TextView chatbox;
    TextView amiconnected;

    @Override
    protected void onPreExecute(){
        chatbox = (TextView) findViewById(R.id.textView2);
        amiconnected = (TextView) findViewById(R.id.textView3);
        PORT = Integer.parseInt(((EditText) findViewById(R.id.editText1)).getText().toString());
    }
    @Override
    protected String doInBackground(String... arg0) {

        //open socket at specified port on the local host
        try {
            socket = new DatagramSocket(PORT);
            //listening

            byte[] buf = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet);
            text2 = new String("Now you're connected.");
            //convert received message to string
            text1 = new String(buf, 0, packet.getLength());

            //get client address from received packet
            //client_addr = packet.getAddress();
            //byte[] message = new byte[1024];

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return text2;
    }

    @Override
    protected void onPostExecute(String text2) {
        // TODO Auto-generated method stub
        super.onPostExecute(text2);
        chatbox.setText(text2);

    }   
Run Code Online (Sandbox Code Playgroud)

编辑:我的整个UDP服务器代码

    package com.example.udpcomm;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Server extends Activity{
    int PORT;
    DatagramSocket socket;
    InetAddress client_addr;
    String text1;
    String text2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server);
        //chatbox = (TextView) findViewById(R.id.textView2);
        Button connectButton = (Button) findViewById(R.id.connectserver);
        connectButton.setOnClickListener(new Button.OnClickListener(){
            public void onClick(View v){
                new ServerThread().execute();
            }
        });
    }
    //parameter string port (converted into int)
    //onprogressupdate (inputting string (?) into TextView)
    //on postexecute return null (?)
    public class ServerThread extends AsyncTask<String, String, String>{
        TextView chatbox;
        TextView amiconnected;

        @Override
        protected void onPreExecute(){
            chatbox = (TextView) findViewById(R.id.textView2);
            amiconnected = (TextView) findViewById(R.id.textView3);
            PORT = Integer.parseInt(((EditText) findViewById(R.id.editText1)).getText().toString());
        }
        @Override
        protected String doInBackground(String... arg0) {

            //open socket at specified port on the local host
            try {
                socket = new DatagramSocket(PORT);
                //listening

                byte[] buf = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);
                text2 = new String("Now you're connected.");
                //convert received message to string
                text1 = new String(buf, 0, packet.getLength());

                //get client address from received packet
                //client_addr = packet.getAddress();
                //byte[] message = new byte[1024];

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return text2;
        }

        @Override
        protected void onPostExecute(String text2) {
            // TODO Auto-generated method stub
            super.onPostExecute(text2);
            chatbox.setText(text2);

        }   

    }


}
Run Code Online (Sandbox Code Playgroud)

kab*_*178 8

您需要将您的UI行为给onPreExecute()onPostExecute()方法为doInBackground不能碰UI.我建议你回到你需要把在字符串或值TextViewdoInBackground方法,然后将其应用到了TextViewonPostExecute()法.参考AsyncTask说明