Java AsyncTask将变量传递给主线程
在使用AsyncTask在另一个线程中完成联网后,我一直在尝试更改textView。我尝试过无数种解决方案,但迄今为止没有一种有效 我实现目标的唯一方法是使用.get(),但它会使UI线程停止一段时间,这是我不想要的Java AsyncTask将变量传递给主线程,java,android,multithreading,networking,android-asynctask,Java,Android,Multithreading,Networking,Android Asynctask,在使用AsyncTask在另一个线程中完成联网后,我一直在尝试更改textView。我尝试过无数种解决方案,但迄今为止没有一种有效 我实现目标的唯一方法是使用.get(),但它会使UI线程停止一段时间,这是我不想要的 我还尝试将AsYcTebug用作一个外部类,并在中间使用一个包装类。 因此,我的问题是,在不冻结主线程的情况下,获取doInBackground()和onPostExecute()中使用的变量的最简单方法是什么?只需在AsyncTask中的以下代码中更新UI即可: @Overrid
我还尝试将AsYcTebug用作一个外部类,并在中间使用一个包装类。
因此,我的问题是,在不冻结主线程的情况下,获取doInBackground()和onPostExecute()中使用的变量的最简单方法是什么?只需在AsyncTask中的以下代码中更新UI即可:
@Override
protected void onPostExecute(Int result) {
textView.setText(result.toString());
}
如果需要额外帮助,请选中此项。您应该从doInBackground()返回变量。框架将确保在onPostExecute()中获得返回值
onPostExecute在UI线程上运行,因此您应该能够刷新此处的任何UI元素 这里有一个方法。您可以在异步任务的参数中提供回调,做任何您想做的事情,然后他们从异步任务中获取值 回调接口:
public interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result, int number);
}
公共接口AsyncTaskCompleteListener{
公共void onTaskComplete(T结果,整数);
}
异步任务:
public class LoadURL extends AsyncTask<String, Process, String> {
private AsyncTaskCompleteListener<String> callback;
public LoadURL(AsyncTaskCompleteListener<String> cb) {
this.callback = cb;
}
protected void onPreExecute() {}
protected String doInBackground(String... arg0) {
// do something
return content;
}
protected void onPostExecute(String content) {
if (callback != null)
callback.onTaskComplete(content,number);
}
}
public class LoginActivity extends Activity implements AsyncTaskCompleteListener<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
LoadURL loadUrl = new LoadURL(LoginActivity.this);
loadUrl.execute(...);
}
@Override
public void onTaskComplete(String result, int number) {...}
}
公共类LoadURL扩展异步任务{
私有AsyncTaskCompleteListener回调;
公共加载URL(AsyncTaskCompleteListener cb){
this.callback=cb;
}
受保护的void onPreExecute(){}
受保护的字符串doInBackground(字符串…arg0){
//做点什么
返回内容;
}
受保护的void onPostExecute(字符串内容){
if(回调!=null)
callback.onTaskComplete(内容、编号);
}
}
活动:
public class LoadURL extends AsyncTask<String, Process, String> {
private AsyncTaskCompleteListener<String> callback;
public LoadURL(AsyncTaskCompleteListener<String> cb) {
this.callback = cb;
}
protected void onPreExecute() {}
protected String doInBackground(String... arg0) {
// do something
return content;
}
protected void onPostExecute(String content) {
if (callback != null)
callback.onTaskComplete(content,number);
}
}
public class LoginActivity extends Activity implements AsyncTaskCompleteListener<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
LoadURL loadUrl = new LoadURL(LoginActivity.this);
loadUrl.execute(...);
}
@Override
public void onTaskComplete(String result, int number) {...}
}
公共类LoginActivity扩展活动实现AsyncTaskCompleteListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
LoadURL LoadURL=新的LoadURL(LoginActivity.this);
loadUrl.execute(…);
}
@凌驾
公共void onTaskComplete(字符串结果,整数){…}
}
在onTaskComplete中,您可以轻松地修改TextView如果您只想在Asynctask之后更改TextView的文本,请尝试onPostExecute中的setText(结果)。我尝试过使用.setText(结果),但它什么也不做。是否可以实现主类的接口?当我尝试这样做时,它只是告诉我接口必须声明为抽象的,但这样做没有帮助。我不明白为什么接口应该是抽象的。但是如果需要,可以将所有内容都放在同一个文件中,但必须在asynctask和回调之前删除public属性。如果需要帮助,请留言:)