Java 无法从AsyncTask和无限循环更新EditText

Java 无法从AsyncTask和无限循环更新EditText,java,android,sockets,loops,android-asynctask,Java,Android,Sockets,Loops,Android Asynctask,我有以下问题。在主线程上,我有一个EditText字段,我有一个AsyncTask,它无限地监听套接字接收消息。在循环中(位于doInBackground()),我试图调用onProgressUpdate(),并向它传递一个字符串,我希望当oPU()接收字符串时,它会显示在主线程的EditText上 public class ClientSide extends AsyncTask<String, String, String>{ public EditText field

我有以下问题。在主线程上,我有一个
EditText
字段,我有一个
AsyncTask
,它无限地监听套接字接收消息。在循环中(位于
doInBackground()
),我试图调用
onProgressUpdate()
,并向它传递一个字符串,我希望当oPU()接收字符串时,它会显示在主线程的
EditText

  public class ClientSide extends AsyncTask<String, String, String>{
  public EditText field = (EditText) findViewById(R.id.bar1);
  ...}
1)
findViewByid()
是活动类中可用的方法。它在AsyncTask类中不可用。因此,像这样将视图传递给AsyncTask

 private Context mContext;
private View yourView;


    public Clientside(Context context, View rootView){
        this.mContext=context;
        this.yourView=rootView;
    }
然后你可以像这样通过它

EditText editText = yourView.findViewById(R.id.edit_text);
请记住,您无法从后台线程更新视图,因此请使用
progressupdate()
postExecute()
方法更新在主线程上运行的EditText

@Override
protected void onPostExecute(String result) {

}


  View rootView = findViewById(android.R.id.content).getRootView();//This will return you the rootView



ClientSide cs = new ClientSide(getApplicationContext(),rootView);//do this in your mainactivity
getApplicationContext()将返回您所处的上下文。


谢谢。我希望这会有所帮助。

我相信要停止此问题,您必须刷新ProgressUpdate中的编辑文本

例如:

protected void onProgressUpdate(String newText) {
  field.setText(newText);
  field.invalidate();  
}
并在主线程外部声明字段变量..而不是在客户端类内部


此onProgressUpdate(..)位于客户端内部。

字段
也是
无法解析符号
。。。这行不通。@KDX2是的,对此很抱歉。我忘了看这个。jois创建视图的方法。我相信findViewById更好。非常感谢您提供如此详细的答案。我现在正在测试你的解决方案。如果你有什么事,我很乐意。。。读一下。再次非常感谢你。我希望把你的答案作为最好的答案来核对。只需给我1-2分钟的时间来运行这个……2)我能理解你的问题。你能解释一下你的第二个问题吗?它是关于如何只制作一次套接字并将其传递给任务。这样,在异步中,我将只执行侦听器,并定期从主线程调用异步线程,从而避免异步中的无限循环。目前,程序做的正好相反——调用异步一次,然后创建套接字一次(ok),但有一个无限循环,我认为这是最糟糕的解决方案。我知道异步是针对短进程的,而不是针对应用程序长进程的,从这个角度来看,如果这是您想要的,那么是“最糟糕的”。然后在主线程中创建一个套接字,并将其传递给构造函数,就像我们在view中所做的那样。这可能会解决你的问题。谢谢你
protected void onProgressUpdate(String newText) {
  field.setText(newText);
  field.invalidate();  
}