【问题标题】:Android: can't get doInBackground result in OnPostExecute method in an AsynctaskAndroid:无法在 Asynctask 中的 OnPostExecute 方法中获取 doInBackground 结果
【发布时间】:2012-11-05 23:07:42
【问题描述】:

我有一个Asynctask的问题,我在OnPostExecute中无法获取doInBackground方法的返回值,你能帮帮我吗?

我将Asynctask的返回值设置为Integer,而我返回的值是一个int,那么为什么应用程序在doInBackground返回时停止了?

如果您能向我解释 Asynctask 的工作原理,我将不胜感激。

非常感谢!!

public class LoginActivity extends Activity 
{
ProgressDialog pDialog;
JSONParser jParser = new JSONParser();

Button btnLogin;
Button btnLinkToRegister;
EditText inputEmail;
EditText inputPassword;
TextView loginErrorMsg;

JSONArray user = null;
ArrayList<HashMap<String, String>> userList;


private static String loginURL = "htttp://example.com/query.php";

private static String KEY_SUCCESS = "success";
private static String KEY_EMAIL = "email";
private static String KEY_PASSWORD = "password";

@Override
public void onCreate(Bundle savedInstanceState) 
{    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    userList = new ArrayList<HashMap<String, String>>();

    inputEmail = (EditText) findViewById(R.id.loginEmail);
    inputPassword = (EditText) findViewById(R.id.loginPassword);
    btnLogin = (Button) findViewById(R.id.btnLogin);
    btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen);

    btnLogin.setOnClickListener(new View.OnClickListener() 
    {   
        @Override
        public void onClick(View v) 
        {
            new CheckUser().execute();          
        }
    });


}

/**
 * Background Async Task to Load all product by making HTTP Request
 * */

class CheckUser extends AsyncTask<String, String, Integer> 
{
    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pDialog = new ProgressDialog(LoginActivity.this);
        pDialog.setMessage("Verifica dati inseriti...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected Integer doInBackground(String... args)
    {
        int valoreOnPostExecute = 0;

        String emailInserted = inputEmail.getText().toString();
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("email", emailInserted));
        // getting JSON string from URL
        JSONObject json = null;

        json = jParser.getJSONFromUrl(loginURL, params);

        // Check your log cat for JSON response
        Log.d("All Users: ", json.toString());

        try 
        {
            // Checking for SUCCESS TAG
            int success = json.getInt(KEY_SUCCESS);

            if (success == 1) 
            {
                // users found
                // Getting Array of users
                user = json.getJSONArray("utenti");

                // looping through All users
                for (int i = 0; i < user.length(); i++) 
                {
                    JSONObject c = user.getJSONObject(i);

                    // Storing each json item in variable
                    String email = c.getString(KEY_EMAIL);
                    String password = c.getString(KEY_PASSWORD);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(KEY_EMAIL, email);
                    map.put(KEY_PASSWORD, password);

                    // adding HashList to ArrayList
                    userList.add(map);
                }

//                    Intent intent = new Intent(LoginActivity.this,GenereMusicale.class);
//                    startActivity(intent);
                    valoreOnPostExecute = success;
                } 
//                else 
//                {
//                  Log.d("success != 1", json.toString());
//                  //Toast.makeText(LoginActivity.this, "Username/password non corretti", Toast.LENGTH_SHORT).show();
//                }
        }
        catch (JSONException e) 
        {
            e.printStackTrace();
            Log.d("User ARRAY", "user array: "+user);
        }

        return valoreOnPostExecute;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(int valoreOnPostExecute) 
    {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread

        if(valoreOnPostExecute == 1)
        {
            Intent intent = new Intent(LoginActivity.this,GenereMusicale.class);
            startActivity(intent);
        }
        else
        {
            new AlertDialog.Builder(LoginActivity.this)
            .setTitle("Fine del Round!")
            //.setMessage("Terminare round?")
            //.setNegativeButton(android.R.string.no, null)
            .setPositiveButton(android.R.string.ok, new OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            }).create().show();
        }
    }

}

}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    您来自doInBackground() 的返回类型与onPostExecute() 中的接收类型不匹配

    这样试试

    class CheckUser extends AsyncTask<String, String, Integer> 
    
    protected Integer doInBackground(String... args)
    
    protected void onPostExecute(Integer valoreOnPostExecute) 
    

    【讨论】:

    • 标记“int”的语法错误,此标记之后的尺寸。如果我是对的,你必须使用 Integer 因为 Asynctask 需要一个对象,而不是原始类型..
    • @TheCondor : 如果您在应用程序崩溃时在此处发布日志,那么它对解决您的问题更有帮助
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-06-05
    • 2015-08-19
    • 2021-06-24
    • 2015-05-08
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多