【问题标题】:how to send data to AsyncTask from Activity?如何从 Activity 向 AsyncTask 发送数据?
【发布时间】:2014-02-20 17:19:28
【问题描述】:

我正在开发一个应用程序,因为我必须向服务器发送数据。我在获取用户详细信息时遇到异常 nullpointer 异常请告诉我哪里出错了

我的活动代码

userDetails = new DetailsDTO();

userName = userNameEdit.getText().toString().trim();
password = passwordEdit.getText().toString().trim();
confirmPwd = confirmPasswordEdit.getText().toString();
mobileNo = mobileNoEdit.getText().toString();

userDetails.setUserName(userName);
userDetails.setPassword(password);
userDetails.setConfirmPwd(confirmPwd);
userDetails.setMobileNumber(mobileNo);

(new UserDetailsAsync(mContext)).execute();

我的 AsyncTask 代码:

    @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            httpClient  = new DefaultHttpClient();
            httpPost = new HttpPost(TrafficConstants.USER_REG_URL);


            Log.e("userName", details.getUserName());
            Log.e("pass", details.getPassword());
            Log.e("MOb",details.getMobileNumber());

            try{
            arrayList = new ArrayList<NameValuePair>(3);
            arrayList.add(new 
                    BasicNameValuePair("usr",details.getUserName()));
            arrayList.add(new 
                   BasicNameValuePair("pass",details.getPassword()));
            arrayList.add(new 
                   BasicNameValuePair("mob",details.getMobileNumber()));
            httpPost.setEntity(new UrlEncodedFormEntity(arrayList));
            HttpResponse response = httpClient.execute(httpPost);
            }
            catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }   

LogCat 错误

 02-20 12:16:37.535: E/AndroidRuntime(2605): java.lang.RuntimeException: An error occured while executing doInBackground()
02-20 12:16:37.535: E/AndroidRuntime(2605):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at java.lang.Thread.run(Thread.java:856)
02-20 12:16:37.535: E/AndroidRuntime(2605): Caused by: java.lang.NullPointerException: println needs a message
02-20 12:16:37.535: E/AndroidRuntime(2605):     at android.util.Log.println_native(Native Method)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at android.util.Log.e(Log.java:231)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at com.technowellServices.locationfind.UserRegistratrionActivity$UserDetailsAsync.doInBackground(UserRegistratrionActivity.java:150)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at com.technowellServices.locationfind.UserRegistratrionActivity$UserDetailsAsync.doInBackground(UserRegistratrionActivity.java:1)
02-20 12:16:37.535: E/AndroidRuntime(2605):     at android.os.AsyncTask$2.call(AsyncTask.java:287)

【问题讨论】:

  • 发布你的错误日志,即 logcat
  • 您已将数据设置为 userDetails 对象并从 details 对象中获取?使用 userDetails 代替 details
  • 我加了请看我的代码下
  • 我写的都是不同的类
  • @Durga Log.e("userName", details.getUserName())``details 可能为空。它在哪里初始化?

标签: android android-asynctask


【解决方案1】:

在你的类中声明 AsyncTask 时,声明如下:

class TestAsyncTask extends AsyncTask<Context, Void, Void>{

            @Override
            protected Void doInBackground(Context... params) {
                // TODO Auto-generated method stub

                             Context context = params[0];                                 

                return null;
            }

        }

第一个参数接受你要传递给你创建的Asynctask的参数。

另外,将其称为:

new TestAsyncTask().execute(MyActivity.this);

【讨论】:

  • @durga : 谢谢你接受答案 :) 你让我很开心
【解决方案2】:

最好尝试将您的对象传递给 AsyncTask doInBackground:

@Override
    protected Void doInBackground(DetailsDTO... params) {
        // TODO Auto-generated method stub
        httpClient  = new DefaultHttpClient();
        httpPost = new HttpPost(TrafficConstants.USER_REG_URL);

        DetailsDTO userDetails = params[0];

        Log.e("userName", userDetails.getUserName());
        Log.e("pass", userDetails.getPassword());
        Log.e("MOb",userDetails.getMobileNumber());

        try{
        arrayList = new ArrayList<NameValuePair>(3);
        arrayList.add(new 
                BasicNameValuePair("usr",userDetails.getUserName()));
        arrayList.add(new 
               BasicNameValuePair("pass",userDetails.getPassword()));
        arrayList.add(new 
               BasicNameValuePair("mob",userDetails.getMobileNumber()));
        httpPost.setEntity(new UrlEncodedFormEntity(arrayList));
        HttpResponse response = httpClient.execute(httpPost);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }   

然后在你的Activity 类中:

new UserDetailsAsync().execute(userDetails);

如果这没有帮助,请准确写出您的活动类的 150 line,这会使您的应用因 NPE 而崩溃。

【讨论】:

    【解决方案3】:

    尝试在 AsyncTask 中创建 userDetails = new DetailsDTO(); 的实例并将 details.getUserName() 更改为 userDetails .getUserName()

    【讨论】:

      【解决方案4】:

      我认为您的 doinbackground 方法返回 null。所以它可能会导致onpostexecute中的错误

      【讨论】:

        【解决方案5】:

        试试这个..

        new UserDetailsAsync(userName,password,confirmPwd,mobileNo,mContext)).execute();
        

        在您的 AsyncTask 中添加构造函数

                String userName,password,confirmPwd,mobileNo;
                Context context;
                //  constructor
                public UserDetailsAsync(String userName,String password,String confirmPwd,String mobileNo, Context context) {
                    this.userName = userName;
                    this.password = password;
                    this.confirmPwd = confirmPwd;
                    this.mobileNo = mobileNo;
                    this.context = context;
                }
        

        或者

        在您的活动中使用您的 userDetails 作为public static userDetails

        在你的 AsyncTask

                Log.e("userName", YourActivity.userDetails.getUserName());
                Log.e("pass", YourActivity.userDetails.getPassword());
                Log.e("MOb", YourActivity.userDetails.getMobileNumber());
        

        【讨论】:

        • @Durga 不,不是。您的初始化为details = new DetailsDTO();,因此它初始化为新的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        相关资源
        最近更新 更多