您好我正在创建访问MySQL数据库的登录页面。但我的Activity
始终运行代码,在完成AsyncTask
之前检查失败/成功。
我尝试使用asynctask.get()
方法,但它只是冻结我的用户界面并且无效。
我试过这个answer说我应该在onPostExecute()
内调用结果检查器方法。
但是因为我需要更改TextView以显示成功/失败,所以它会导致NullPointerException
因为我在onCreate()
内实例化TextView。
我无法将TextView实例化移动到构造函数中,因为它将返回NullPointerException unable to instantiate 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");
}
}
AsyncClass.java
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);
}
}
任何解决方案?感谢
答案 0 :(得分:3)
如何将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);
}
}
}
答案 1 :(得分:2)
试试这个
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
}
}
答案 2 :(得分:2)
您无法从异步任务线程编辑UI。要更新UI线程,请使用onProgressUpdate()方法。这个方法是你的AsyncTask类的一部分,实际上是在主UI线程中执行的(我希望你使用async任务作为嵌套类btw,因为它被声明为public我猜你不是。你应该改变它)。如果在异步任务中调用publishProgress(...),则OS本身会调用onProgressUpdate()方法。
小样本:
protected JSONObject doInBackground(String... params){
publishProgress("test");
}
/**
* This method is part of the Async Task
*/
protected void onProgressUpdate(String... progress) {
login.checkSuccess(true);
}
答案 3 :(得分:1)
我会这样使用它,只需覆盖你需要它的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();
等待不是答案,因为你不知道你的Asynctask需要多长时间才能结束。 上面的代码没有测试,只是假,但它应该显示我的意思。
这里没有我的IDE,所以如果有必要的话,任何人都会更正括号!
格尔茨