我有以下问题。在主线程上我有一个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.如何使AsyncTasks
与findViewById()
UI元素真正匹配?
2.每次应用程序需要在后台执行其消息监听器时,如何重新组织我的代码以便不创建套接字?
你也可以看到Async .. doInBackground:
EditText
答案 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 ..