Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask将变量传递给主线程_Java_Android_Multithreading_Networking_Android Asynctask - Fatal编程技术网

Java AsyncTask将变量传递给主线程

Java AsyncTask将变量传递给主线程,java,android,multithreading,networking,android-asynctask,Java,Android,Multithreading,Networking,Android Asynctask,在使用AsyncTask在另一个线程中完成联网后,我一直在尝试更改textView。我尝试过无数种解决方案,但迄今为止没有一种有效 我实现目标的唯一方法是使用.get(),但它会使UI线程停止一段时间,这是我不想要的 我还尝试将AsYcTebug用作一个外部类,并在中间使用一个包装类。 因此,我的问题是,在不冻结主线程的情况下,获取doInBackground()和onPostExecute()中使用的变量的最简单方法是什么?只需在AsyncTask中的以下代码中更新UI即可: @Overrid

在使用AsyncTask在另一个线程中完成联网后,我一直在尝试更改textView。我尝试过无数种解决方案,但迄今为止没有一种有效

我实现目标的唯一方法是使用.get(),但它会使UI线程停止一段时间,这是我不想要的

我还尝试将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属性。如果需要帮助,请留言:)