Android - AsyncTask 之后的 Intent 数据

Posted

技术标签:

【中文标题】Android - AsyncTask 之后的 Intent 数据【英文标题】:Android - Intent data after AsyncTask 【发布时间】:2021-07-10 08:22:55 【问题描述】:

服务器连接正在后台 (AsyncTask) 和服务器响应 JSON 上工作。 我想将数据从服务器发送到其他活动,但它不工作。 我试图解决这个问题,但没有任何效果。我该如何解决这个问题? 我的代码如下:

public class LoginRequest extends AsyncTask<Void, Void, String> 

    String errorMsg = LOGIN_ERROR;
    String builder;

    @Override
    protected String doInBackground(Void... voids) 

        JSONObject requestJsonObject = new JSONObject();
        try 

            requestJsonObject.put("email", userEmail);
            requestJsonObject.put("password", userPassword);
         catch (JSONException e) 

            e.printStackTrace();
        

        requestQueue = Volley.newRequestQueue(getApplicationContext());

        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.POST,
                BASE_URL,
                requestJsonObject,
                response -> 
                    errorMsg = LOGIN_SUCCESS;
                    Log.d(TAG, "response = " + response);
                    builder = response.toString();
                ,
                error -> errorMsg = LOGIN_ERROR
        );

        requestQueue.add(request);
        return null;
    

    @Override
    protected void onPostExecute(String s) 
        super.onPostExecute(s);

        if (errorMsg.equals(LOGIN_ERROR)) 

            textViewError.setText(R.string.login_failure);
         else 

            Toast.makeText(getApplicationContext(), "Login Success", Toast.LENGTH_SHORT).show();
            // Send data from server to UserMainActivity
            Intent intent = new Intent(LoginActivity.this, UserMainActivity.class);
            intent.putExtra("serverMessage", builder);
            startActivity(intent);
        
    

【问题讨论】:

尝试删除 super.onPostExecute(s); 不,不要像@Shayan所说的那样删除super.onPostExecute(s) 你所做的并没有错。以最短的方式发布您的 json 响应,并向我们展示您如何处理 UserMainActivity 中传递的变量。 @ZankrutParmar 我在响应侦听器中将 JSON 数据从服务器更改为字符串,并将 UserMainActivity 中的数据作为 Intent dataIntent = getIntent(); serverMessage = dataIntent.getStringExtra(SERVER_MESSAGE); serverMessage 只是字符串变量。 【参考方案1】:

您应该将您的活动上下文传递给您的 asyncTask 并从该上下文启动活动

您的 AsyncTask 应如下所示

private class LoginRequest extends AsyncTask<Void, Void, String> 


    Context context;
    LoginRequest(Context context)
    
        this.context=context;
    


    String builder;

    @Override
    protected String doInBackground(Void... voids) 

        //your code here

        return null;
    

    @Override
    protected void onPostExecute(String s)  

        //your code here

        Intent intent = new Intent(context, NewActivity.class);
        intent.putExtra("serverMessage", builder);
        context.startActivity(intent);
    

像这样调用这个 asyncTask

    LoginRequest asyncTaskForceUpdate=new LoginRequest(this);
    asyncTaskForceUpdate.execute();

【讨论】:

标志来检查登录是否成功?在响应侦听器中,我将 errorMsg 变量更改为 SUCCESS,错误侦听器将 errorMsg 变量更改为 FAIL,但是在 Method onPostExecute 中,出现了一个错误,类似于 Attempt to invoke virtual method 'boolean java.lang.String.equals(java. lang.Object)' 在空对象引用上【参考方案2】:

尝试如下更改您的代码:

public class LoginRequest extends AsyncTask<Void, Void, String> 

    String errorMsg = "ERROR";
    String builder = "";

    @Override
    protected String doInBackground(Void... voids) 

        JSONObject requestJsonObject = new JSONObject();
        try 

            requestJsonObject.put("email", userEmail);
            requestJsonObject.put("password", userPassword);
         catch (JSONException e) 

            e.printStackTrace();
        

        requestQueue = Volley.newRequestQueue(getApplicationContext());

        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.POST,
                BASE_URL,
                requestJsonObject,
                response -> 
                    errorMsg = "SUCCESS";
                    Log.d(TAG, "response = " + response);
                    builder = response.toString();
                ,
                error -> errorMsg = "ERROR"
        );

        requestQueue.add(request);
        return errorMsg;
    

    @Override
    protected void onPostExecute(String s) 
        super.onPostExecute(s);

        if (s.equals("ERROR")) 

            textViewError.setText(R.string.login_failure);
         else 

            Toast.makeText(getApplicationContext(), "Login Success", Toast.LENGTH_SHORT).show();
            // Send data from server to UserMainActivity
            Intent intent = new Intent(LoginActivity.this, UserMainActivity.class);
            intent.putExtra("serverMessage", builder);
            startActivity(intent);
        
    

我将doInBackground 的返回值更改为errorMsg。因为这是更常见的做法。告诉我这是否有效。

【讨论】:

以上是关于Android - AsyncTask 之后的 Intent 数据的主要内容,如果未能解决你的问题,请参考以下文章

android中 如果要你来设计AsyncTask,你怎么设计

Android中AsyncTask使用具体解释

android asyncTask

android 异步任务AsyncTask

Android AsyncTask 中的 ArrayList

在 AsyncTask 的 onPostExecute 之后,无法按意图更新 RecyclerView