Android 等待任务完成

Android 等待任务完成,android,android-asynctask,Android,Android Asynctask,嗨,我正在制作一个访问MySQL数据库的登录页面。但是我的活动总是在完成异步任务之前运行检查失败/成功的代码 我尝试使用asynctask.get()方法,但它只是冻结了我的UI,无法工作 我尝试了这个方法,它说我应该在onPostExecute()中调用结果检查器方法 但由于我需要更改TextView以显示成功/失败,因此会导致NullPointerException,因为我在onCreate()中实例化了TextView 我无法将TextView实例化移动到构造函数中,因为它将返回NullP

嗨,我正在制作一个访问MySQL数据库的登录页面。但是我的
活动
总是在完成
异步任务
之前运行检查失败/成功的代码

我尝试使用
asynctask.get()
方法,但它只是冻结了我的UI,无法工作

我尝试了这个方法,它说我应该在
onPostExecute()中调用结果检查器方法

但由于我需要更改TextView以显示成功/失败,因此会导致
NullPointerException
,因为我在
onCreate()中实例化了TextView

我无法将TextView实例化移动到构造函数中,因为它将返回
NullPointerException无法实例化activity ComponentInfo

Login.java

public class Login extends Activity{

    //declare global Views here

    protected void onCreate(Bundle bundle){
        //Setup views
    }

    protected void onClick(View v){
        //Setup necessary variables
        AsyncClass async = new AsyncClass(this);
        async.execute(username, password);
    }

    public void checkSuccess(boolean success){
        if(success)
            textView1.setText("Success");
        else
            textView1.setText("Failed");
    }
}
public class AsyncClass extends AsyncTask<String, String, JSONObject>{
    protected JSONObject doInBackground(String... params){
        //access database
    }

    protected void onPostExecute(JSONObject json){
        //read the json result
        Login login = new Login();
        login.checkSuccess(true);
    }
}
AsyncClass.java

public class Login extends Activity{

    //declare global Views here

    protected void onCreate(Bundle bundle){
        //Setup views
    }

    protected void onClick(View v){
        //Setup necessary variables
        AsyncClass async = new AsyncClass(this);
        async.execute(username, password);
    }

    public void checkSuccess(boolean success){
        if(success)
            textView1.setText("Success");
        else
            textView1.setText("Failed");
    }
}
public class AsyncClass extends AsyncTask<String, String, JSONObject>{
    protected JSONObject doInBackground(String... params){
        //access database
    }

    protected void onPostExecute(JSONObject json){
        //read the json result
        Login login = new Login();
        login.checkSuccess(true);
    }
}
公共类AsyncClass扩展了AsyncTask{
受保护的JSONObject doInBackground(字符串…参数){
//access数据库
}
受保护的void onPostExecute(JSONObject json){
//读取json结果
Login Login=新登录();
login.checkSuccess(true);
}
}
有解决办法吗?谢谢你试试这个

protected void onPostExecute(JSONObject json){
    //read the json result
    Login login = (Login)context; // object that you pass to task constructor
    login.checkSuccess(true);
}
您还可以将“进度”对话框添加到任务中,以指示某些作业的执行

public class BaseTask<T> extends AsyncTask<Object, Void, T> {

public Context context;
public ProgressDialog dialog;

public BaseTask(Context context) {
    this.context = context;
    this.dialog = new ProgressDialog(context);
}

@Override
protected void onPreExecute() {
    this.dialog.setMessage(context.getResources().getString(R.string.loading));
    this.dialog.show();

}

@Override
protected T doInBackground(Object... objects) {
    //....
    return something;
}

@Override
protected void onPostExecute(T result) {
    if (dialog != null && dialog.isShowing())
        dialog.dismiss();
    // do something
}
公共类BaseTask扩展了AsyncTask{
公共语境;
公共对话;
公共基任务(上下文){
this.context=上下文;
this.dialog=newprogressdialog(上下文);
}
@凌驾
受保护的void onPreExecute(){
this.dialog.setMessage(context.getResources().getString(R.string.loading));
this.dialog.show();
}
@凌驾
受保护的T doInBackground(对象…对象){
//....
归还某物;
}
@凌驾
受保护的void onPostExecute(T结果){
if(dialog!=null&&dialog.isShowing())
dialog.dismise();
//做点什么
}

}将AsyncTask作为内部类如何

因此,您的代码应该如下所示

public class Login extends Activity {

    //declare global Views here

    protected void onCreate(Bundle bundle) {
        //Setup views
    }

    protected void onClick(View v) {
        new AsyncClass().execute(username, password);
    }

    public void checkSuccess(boolean success) {
        if (success) textView1.setText("Success");
        else textView1.setText("Failed");
    }

    class AsyncClass extends AsyncTask < String, String, JSONObject > {
        protected JSONObject doInBackground(String...params) {
            //access database
        }

        protected void onPostExecute(JSONObject json) {
            checkSuccess(true / false);
        }
    }
}
公共类登录扩展活动{
//在此声明全局视图
创建时受保护的void(捆绑){
//设置视图
}
受保护的void onClick(视图v){
新建AsyncClass().execute(用户名、密码);
}
公共无效检查成功(布尔成功){
if(success)textView1.setText(“success”);
else textView1.setText(“失败”);
}
类AsyncClass扩展AsyncTask{
受保护的JSONObject doInBackground(字符串…参数){
//access数据库
}
受保护的void onPostExecute(JSONObject json){
检查成功(对/错);
}
}
}

无法从异步任务线程编辑UI。要更新UI线程,请使用onProgressUpdate()方法。此方法是AsyncTask类的一部分,实际上是在主UI线程中执行的(顺便说一句,我希望您将async任务用作嵌套类,因为它声明为公共的,我想您的不是。您应该更改它)。如果在异步任务中调用publishProgress(…),则操作系统本身将调用onProgressUpdate()方法

小样本:

protected JSONObject doInBackground(String... params){
    publishProgress("test");
}

    /**
     * This method is part of the Async Task
     */
    protected void onProgressUpdate(String... progress) {
        login.checkSuccess(true);
    }   

我会这样使用它,只需在需要的地方重写onPostExecute或创建自己的接口

//create a object f your asyncclass and 
//override the onPostExecute where you need it
mInfo = new ASYNCCLASS({
   @Override
   public void onPostExecute(Object result){
      //doSomething something with your views!

  }
}).execute();
等待不是答案,因为您不知道任务需要多长时间才能结束。 上面的代码并没有经过测试,只是伪CE,但它应该显示我的意思

没有我的IDE在这里,所以如果有人愿意纠正括号,如果必要将是伟大的


格里茨

哇,真管用!你能解释一下这是什么魔法吗?感谢没有魔法,只是您不需要直接创建活动对象。将活动传递给任务并使用它。如果将任务设置为内部类,则可以从onPostExecute()更新UI;如果将任务设置为外部类,则可以使用活动实例或侦听器。谢谢您的回答。“嵌套类”与内部类相同吗?我认为
onProgressUpdate()
用于填充进度条之类的东西?onProgressUpdate()用于更新UI线程。这取决于你在那里实际做什么。可以从更新进度条到更改文本视图等等。是的,我所说的嵌套类是一个内部类。谢谢,这看起来是个好主意。但是我需要我的
AsyncTask
在外部,因为它被多个活动调用。如果他想重新使用它,他会如何使用它?代码中最明显的问题是,您直接调用
活动的构造函数。你不应该自己实例化一个
活动,请查看@dave.c谢谢你的提示。