如何使AsyncTask的postExecute发送变量回主类 [英] How to make Asynctask postExecute send variable back to main class
问题描述
我有我的课叫做Main.java它运行的UI。我有一个名为VerifyCreds.java另一类延伸AsyncTask的。 VerifyCreds整个目的是在另一个线程调用运行到我的服务器,因此不会死机我的UI。我没有做在Main.java sublcassed因为我将有一个数字,将拨打电话到服务器的其他类,我想将它们全部使用VerifyCreds类来做到这一点。
我需要什么,能够做的就是从VerifyCreds.java数据传递回Main.java。但得到一个错误,而且低于code。
任何帮助AP preciated!谢谢!
下面是我的Main.java code
包com.coolprograms.zeal;
<<<进口为简便起见&GT去除;> 公共类主要活动延伸
{//全局变量的
字符串标记=ZEAL;
静态布尔AUTH code;/ **当第一次创建活动调用。 * /
@覆盖
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.login); //抓斗元素
最终的EditText的userName =(EditText上)findViewById(R.id.usernameBOX);
最终的EditText userPWD =(EditText上)findViewById(R.id.passwordBOX);
最终按钮loginBTN =(按钮)findViewById(R.id.loginBTTN); //按钮侦听
loginBTN.setOnClickListener(新View.OnClickListener()
{ @覆盖
公共无效的onClick(视图v)
{
//获取用户名和密码,并添加到阵列
ArrayList的<串GT; creds =新的ArrayList<串GT;();
creds.add(userName.getText()的toString());
creds.add(userPWD.getText()的toString()); //调用方法,将执行的AsyncTask从服务器获取creds
验证(creds);
}
});
}私人无效验证(ArrayList的<串GT; creds)
{
//开始的AsyncTask得到creds
新的verifyCredentials(本).execute(creds);
}公共接口credsAuth
{
公共无效authorizedCreds(布尔AUTH code);}公共无效verifiedCreds(上下文CTX,布尔serverAuth)
{
如果(serverAuth =真)
{
//移动到下一个屏幕,如果我们被授权
意图I =新意图(CTX,Items.class);
startActivity(ⅰ);
}
}
}
下面是VerifyCreds.java code
包com.coolprograms.zeal;
<<<进口为简便起见&GT去除;>
公共类的verifyCredentials扩展的AsyncTask< ArrayList的<弦乐>中太虚,布尔> {私人上下文CTX;
ProgressDialog对话框;公众的verifyCredentials(上下文的applicationContext)
{
// TODO自动生成构造函数存根
CTX =的applicationContext;
对话框=新ProgressDialog(的applicationContext);
}@覆盖
在preExecute保护无效()
{
dialog.setTitle(请稍候);
dialog.setMessage(验证用户名和密码......);
dialog.show();
}
@覆盖
保护布尔doInBackground(ArrayList的<弦乐> ... creds)
{
//回来
布尔serverAnwser = FALSE; //获取vim的信任状
字符串userid = creds [0]获得(0)的ToString();
Log.i(ZEAL,Creds [0]:+ creds [0]获得(0)的ToString());
串userPWD = creds [0]获得(1)的ToString();
Log.i(ZEAL,Creds [1]:+ creds [0]获得(1)的ToString()); //从服务器creds
尝试{
字符串serverANW = NULL;
网址getCreds =新的URL(http://XXX.XXX.XXX.XXX/api/api.php?method=getCreds&id=+用户ID +&放大器; PWD =+ userPWD);
Log.i(ZEAL,web服务的URL:+ getCreds.toString()); URLConnection的TC = getCreds.openConnection();
在的BufferedReader =新的BufferedReader(新的InputStreamReader(
tc.getInputStream())); //获取JSON对象
JSONArray jArray;
jArray =新JSONArray(in.readLine()); //日志JSON对象返回
Log.i(ZEAL,jArray.toString()); //检查服务器响应
//的for(int i = 0; I< jArray.length();我++)
// {
JSONObject的E = jArray.getJSONObject(0);
字符串s = e.getString(RETURN);
JSONObject的jObject =新的JSONObject(S);
serverANW = jObject.getString(结果);
Log.i(ZEAL,API结果:+ serverANW);
//} 如果(serverANW.equalsIgnoreCase(真))
{
serverAnwser = TRUE;
Log.i(ZEAL,ServerANW =+ serverANW.toString());
Log.i(ZEAL,设置服务器anwser为true);
}
其他
{
serverAnwser = FALSE;
Log.i(ZEAL,ServerANW =+ serverANW.toString());
Log.i(ZEAL,设置服务器anwser假 - + serverAnwser.toString());
} }赶上(MalformedURLException的E){
// TODO自动生成catch块
e.printStackTrace();
}赶上(IOException异常五){
// TODO自动生成catch块
e.printStackTrace();
}赶上(JSONException E){
// TODO自动生成catch块
e.printStackTrace();
}
返回serverAnwser;
}@覆盖
保护无效onPostExecute(最终布尔AUTH code)
{
dialog.dismiss(); //记录哪些功能是做
Log.d(ZEAL,服务器响应:+ AUTH code.toString());
Toast.makeText(CTX,服务器云:+ AUTH code.toString(),Toast.LENGTH_LONG).show();
主要M =新的Main();
m.verifiedCreds(男,AUTH code);}
}
ERROR:
05-23 15:18:57.190:E / AndroidRuntime(25475):致命异常:主要
05-23 15:18:57.190:E / AndroidRuntime(25475):显示java.lang.NullPointerException
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
。05-23 15:18:57.190:E / AndroidRuntime(25475):在android.content.ComponentName<&初始化GT;(ComponentName.java:75)
。05-23 15:18:57.190:E / AndroidRuntime(25475):在android.content.Intent<&初始化GT;(Intent.java:3174)
05-23 15:18:57.190:E / AndroidRuntime(25475):在com.coolprograms.zeal.Main.verifiedCreds(Main.java:85)
05-23 15:18:57.190:E / AndroidRuntime(25475):在com.coolprograms.zeal.VerifyCredentials.onPostExecute(VerifyCredentials.java:117)
05-23 15:18:57.190:E / AndroidRuntime(25475):在com.coolprograms.zeal.VerifyCredentials.onPostExecute(VerifyCredentials.java:1)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.os.AsyncTask.finish(AsyncTask.java:602)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.os.AsyncTask.access $ 600(AsyncTask.java:156)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:615)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.os.Handler.dispatchMessage(Handler.java:99)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.os.Looper.loop(Looper.java:137)
05-23 15:18:57.190:E / AndroidRuntime(25475):在android.app.ActivityThread.main(ActivityThread.java:4424)
05-23 15:18:57.190:E / AndroidRuntime(25475):在java.lang.reflect.Method.invokeNative(本机方法)
05-23 15:18:57.190:E / AndroidRuntime(25475):在java.lang.reflect.Method.invoke(Method.java:511)
05-23 15:18:57.190:E / AndroidRuntime(25475):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
05-23 15:18:57.190:E / AndroidRuntime(25475):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-23 15:18:57.190:E / AndroidRuntime(25475):在dalvik.system.NativeStart.main(本机方法)
您可以创建一个接口,让主实现该接口,通过主要作为构造参数传递给AsyncTask的,并将它称之为主与你要传递的参数回来了。
接口:
公共接口CredListener(){
无效验证(布尔状态);
}
在类定义声明主要实现CredListener
类主要扩展活动实现CredListener {
...
有关的verifyCredentials()新的构造:
公开的verifyCredentials(CredListener监听器,上下文的applicationContext)
{
this.listener =利斯特; //记得监听器 CTX =的applicationContext;
对话框=新ProgressDialog(的applicationContext);
}
在onPostExecute(最终布尔AUTH code)提供结果到监听器:
listener.verify(AUTH code);
这是主要的到的verifyCredentials更加松耦合。
I have my class called Main.java which runs the UI. I have another class called VerifyCreds.java which extends AsyncTask. VerifyCreds whole purpose is to run calls to my server on another thread so as to not lockup my UI. I don't have it sublcassed in Main.java because I will have a number of other classes that will be making calls to the server and I would like to have them all use the VerifyCreds class to do it.
What I need to be able to do is pass data back to Main.java from VerifyCreds.java. but getting a error with the below code.
Any help is appreciated! Thanks!
Here is my Main.java code
package com.coolprograms.zeal;
<<<imports removed for brevity>>
public class Main extends Activity
{
// Global VAR's
String TAG = "ZEAL";
static Boolean authCode;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//Grab elements
final EditText userName = (EditText)findViewById(R.id.usernameBOX);
final EditText userPWD = (EditText)findViewById(R.id.passwordBOX);
final Button loginBTN = (Button)findViewById(R.id.loginBTTN);
//Button listener
loginBTN.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// Get username and password and add to array
ArrayList<String> creds = new ArrayList<String>();
creds.add(userName.getText().toString());
creds.add(userPWD.getText().toString());
// Call method that will execute AsyncTask to get creds from server
verify(creds);
}
});
}
private void verify (ArrayList<String> creds)
{
// Start AsyncTask to get creds
new VerifyCredentials(this).execute(creds);
}
public interface credsAuth
{
public void authorizedCreds(Boolean authCode);
}
public void verifiedCreds(Context ctx, Boolean serverAuth)
{
if(serverAuth = true)
{
// Move to next screen if we are authorized
Intent i = new Intent(ctx, Items.class);
startActivity(i);
}
}
}
Here is the VerifyCreds.java code
package com.coolprograms.zeal;
<<<imports removed for brevity>>
public class VerifyCredentials extends AsyncTask<ArrayList<String>, Void, Boolean> {
private Context ctx;
ProgressDialog dialog;
public VerifyCredentials(Context applicationContext)
{
// TODO Auto-generated constructor stub
ctx = applicationContext;
dialog = new ProgressDialog(applicationContext);
}
@Override
protected void onPreExecute()
{
dialog.setTitle("Please wait");
dialog.setMessage("Verifying username and password...");
dialog.show();
}
@Override
protected Boolean doInBackground(ArrayList<String>...creds)
{
//To return
Boolean serverAnwser = false;
//Get the creds
String userID = creds[0].get(0).toString();
Log.i("ZEAL", "Creds[0]: " + creds[0].get(0).toString());
String userPWD = creds[0].get(1).toString();
Log.i("ZEAL", "Creds[1]: " + creds[0].get(1).toString());
//Get creds from server
try {
String serverANW = null;
URL getCreds = new URL("http://XXX.XXX.XXX.XXX/api/api.php?method=getCreds&id=" + userID + "&pwd=" + userPWD);
Log.i("ZEAL", "Webservice URL: " + getCreds.toString());
URLConnection tc = getCreds.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
tc.getInputStream()));
// Get JSON Object
JSONArray jArray;
jArray = new JSONArray(in.readLine());
//Log json object returned
Log.i("ZEAL", jArray.toString());
//Check server response
//for (int i = 0; i < jArray.length(); i++)
//{
JSONObject e = jArray.getJSONObject(0);
String s = e.getString("RETURN");
JSONObject jObject = new JSONObject(s);
serverANW = jObject.getString("RESULT");
Log.i("ZEAL", "API Result: " + serverANW);
//}
if(serverANW.equalsIgnoreCase("True"))
{
serverAnwser = true;
Log.i("ZEAL", "ServerANW = " + serverANW.toString());
Log.i("ZEAL", "Setting server anwser to true");
}
else
{
serverAnwser = false;
Log.i("ZEAL", "ServerANW = " + serverANW.toString());
Log.i("ZEAL", "Setting server anwser to false - " + serverAnwser.toString());
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return serverAnwser;
}
@Override
protected void onPostExecute(final Boolean authCode)
{
dialog.dismiss();
// Log what the functions is doing
Log.d("ZEAL","Server Response: " + authCode.toString());
Toast.makeText(ctx, "Server says: " + authCode.toString(), Toast.LENGTH_LONG).show();
Main m = new Main();
m.verifiedCreds(m, authCode);
}
}
ERROR:
05-23 15:18:57.190: E/AndroidRuntime(25475): FATAL EXCEPTION: main
05-23 15:18:57.190: E/AndroidRuntime(25475): java.lang.NullPointerException
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.content.ComponentName.<init>(ComponentName.java:75)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.content.Intent.<init>(Intent.java:3174)
05-23 15:18:57.190: E/AndroidRuntime(25475): at com.coolprograms.zeal.Main.verifiedCreds(Main.java:85)
05-23 15:18:57.190: E/AndroidRuntime(25475): at com.coolprograms.zeal.VerifyCredentials.onPostExecute(VerifyCredentials.java:117)
05-23 15:18:57.190: E/AndroidRuntime(25475): at com.coolprograms.zeal.VerifyCredentials.onPostExecute(VerifyCredentials.java:1)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.os.AsyncTask.finish(AsyncTask.java:602)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.os.AsyncTask.access$600(AsyncTask.java:156)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.os.Looper.loop(Looper.java:137)
05-23 15:18:57.190: E/AndroidRuntime(25475): at android.app.ActivityThread.main(ActivityThread.java:4424)
05-23 15:18:57.190: E/AndroidRuntime(25475): at java.lang.reflect.Method.invokeNative(Native Method)
05-23 15:18:57.190: E/AndroidRuntime(25475): at java.lang.reflect.Method.invoke(Method.java:511)
05-23 15:18:57.190: E/AndroidRuntime(25475): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-23 15:18:57.190: E/AndroidRuntime(25475): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-23 15:18:57.190: E/AndroidRuntime(25475): at dalvik.system.NativeStart.main(Native Method)
You could create an interface, let Main implement that interface, pass Main as a constructor parameter to the asynctask and have it call Main with the parameter you want to pass back.
The Interface:
public interface CredListener() {
void verify(Boolean status);
}
In the class definition declare that Main implements CredListener
class Main extends Activity implements CredListener {
...
The new Constructor for VerifyCredentials():
public VerifyCredentials(CredListener listener, Context applicationContext)
{
this.listener = lister; // remember the listener
ctx = applicationContext;
dialog = new ProgressDialog(applicationContext);
}
In onPostExecute(final Boolean authCode) give the result to the listener:
listener.verify(authCode);
This is a more loose coupling of Main to VerifyCredentials.
这篇关于如何使AsyncTask的postExecute发送变量回主类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!