异步任务中的Android setText [英] Android setText in asynctask

查看:15
本文介绍了异步任务中的Android setText的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个 UDP 程序,但在我的 asynctask 中应用 setText 时遇到问题.基本上在 UDP 服务器上,我只要求输入一个端口,然后服务器应该连接到本地主机和端口.布局中间的 TextView 显示当前未连接",当我单击连接到端口时,我希望它更改为已连接".但是,它没有做任何事情.我尝试四处寻找,但无法想出解决方案.如果有人能帮我找出问题,将不胜感激.

I'm working on a UDP program but I'm having trouble with applying setText in my asynctask. Basically on the UDP server, I just ask to input a port and then the server should connect to the localhost and the port. A TextView in the middle of the layout says "Currently not connected" and when I click connect to a port, I want it to change to "Connected." However, it is not doing anything. I tried searching around but was unable to come up with a solution. If anyone can help me figure out the problem that would be greatly appreciated.

我的线程异步任务代码:从 doinbackground 中取出 setText.但是,setText 仍然不起作用.

My Thread asynctask code: took setText out of doinbackground. However, setText still is not functional.

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);

    }   

我的整个 UDP 服务器代码

My entire UDP Server code

    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);

        }   

    }


}

推荐答案

您需要将 UI 操作移动到 onPreExecute()onPostExecute() 方法作为 doInBackground 不能触及 UI.我建议您从 doInBackground 方法返回需要放入 TextView 的字符串或值,然后将其应用到 TextViewonPostExecute() 方法.参考 AsyncTask 说明

You need to move your UI actions to the onPreExecute() or the onPostExecute() methods as doInBackground cannot touch the UI. I would suggest you return the string or value you need to put in the TextView from the doInBackground method and then apply it to the TextView in the onPostExecute() method. Reference AsyncTask Description

这篇关于异步任务中的Android setText的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆