如何使AsyncTask的postExecute发送变量回主类 [英] How to make Asynctask postExecute send variable back to main class

查看:99
本文介绍了如何使AsyncTask的postExecute发送变量回主类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的课叫做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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆