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

时间:2016-03-27 08:57:44

标签: java android sockets loops android-asynctask

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

EditText

第一个问题是on public class ClientSide extends AsyncTask<String, String, String>{ public EditText field = (EditText) findViewById(R.id.bar1); ...} 它说无法解析符号。可能导致它的原因,我该如何解决它。 第二个问题是循环。问题是我不想通过主线程周期性地创建新的findViewById(R.id.bar1)对象,因为在我的情况下,它意味着创建一个套接字并在每次对象为.execute() - ed时绑定它。请建议我重新组织我的代码,以便使解决方案更优雅。我知道AsyncTask用于短流程而不是app-long,所以我理解我当前的解决方案(带循环)是一个分解的胡萝卜(a.k.a。坏的)。 再来一次:  1.如何使AsyncTasksfindViewById() UI元素真正匹配?  2.每次应用程序需要在后台执行其消息监听器时,如何重新组织我的代码以便不创建套接字?

你也可以看到Async .. doInBackground:

EditText

2 个答案:

答案 0 :(得分:1)

1)findViewByid()是Activity类中可用的方法。它在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()会返回您所在的上下文。

THANKYOU。我希望这很有帮助。

答案 1 :(得分:1)

我相信要停止此问题,您必须刷新 onProgressUpdate

内的EditText

例如:

protected void onProgressUpdate(String newText) {
  field.setText(newText);
  field.invalidate();  
}

并在主线程外部声明字段变量..不在客户端类中。

此onProgressUpdate(..)位于您的ClientSide ..