在AsyncTask的得到空 [英] get null in AsyncTask

查看:203
本文介绍了在AsyncTask的得到空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的AsyncTask codeS返回NULL时尝试登录。我糊涂了,为什么设备,它可以抛出敬酒返回空......,但它模拟器强制关闭,请人帮我解决这个问题。非常感谢你。

login.java

 公共类扩展登录活动{
    公共Koneksi linkurl;
    串SERVER_URL;
    私人按钮登录,注册,设置;
    私人的EditText用户名,密码;
    公共ProgressDialog progressDialog;
    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.login);        设置=(按钮)findViewById(R.id.bsetting);
        登录=(按钮)findViewById(R.id.login);
        注册=(按钮)findViewById(R.id.reg);
        用户名=(的EditText)findViewById(R.id.uname);
        密码=(EditText上)findViewById(R.id.pass);        setting.setOnClickListener(新OnClickListener(){            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                意图int​​entSet =新意图(Login.this,UrlSetting.class);
                startActivity(intentSet);
            }
        });        register.setOnClickListener(新OnClickListener(){            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                意图int​​entReg =新意图(Login.this,Register.class);
                startActivity(intentReg);
            }
        });        login.setOnClickListener(新OnClickListener(){            公共无效的onClick(视图v){                // TODO自动生成方法存根               新LoginTask()执行();            }
        });
    }
    保护字符串tryLogin(字符串mUsername,字符串mPassword)
    {
      Log.d(TryLoginCheck,在这里);
        HttpURLConnection的连接;
       OutputStreamWriter请求= NULL;            网址URL = NULL;
            串响应=无效;
            字符串TEMP = NULL;
            字符串参数=用户名=+ mUsername +&放大器;密码=+ mPassword;
            的System.out.println(用户名+ mUsername +\\ n+密码+ mPassword);
            Log.d(参数,参数);
            尝试
            {
                ;
                linkurl =新Koneksi(本);
                SERVER_URL = linkurl.getUrl();
                SERVER_URL + =/mobile/Login.php;
                URL =新的URL(SERVER_URL);
                连接=(HttpURLConnection类)url.openConnection();
                connection.setDoOutput(真);
                connection.setRequestProperty(内容类型,应用程序/ x-WWW的形式urlen codeD);
                connection.setRequestMethod(POST);                请求=新OutputStreamWriter(connection.getOutputStream());
                request.write(参数);
                request.flush();
                request.close();
                串线=;
                InputStreamReader的ISR =新的InputStreamReader(connection.getInputStream());
                读者的BufferedReader =新的BufferedReader(ISR);
                StringBuilder的SB =新的StringBuilder();
                而((行= reader.readLine())!= NULL)
                {                    sb.append(行+\\ n);
                }
                TEMP = sb.toString();
                Log.d(温度,温度);                响应= sb.toString();
                Log.d(响应,响应);
               Log.d(保安局值,sb.toString());
                isr.close();
                reader.close();
            }
            赶上(IOException异常E)
            {
                e.printStackTrace();
                Log.d(错误,e.getMessage());
                返回null;
            }            返回响应;
    }    公共类LoginTask扩展的AsyncTask<字符串,字符串,字符串> {        串响应=无效;        @覆盖
        在preExecute保护无效()
        {        }
        @覆盖
        保护字符串doInBackground(字符串...为arg0)
        {
            。字符串mUsername = username.getText()的toString();
               。字符串mPassword = password.getText()的toString();
               返回tryLogin(mUsername,mPassword);
        }
      保护无效onPostExecute(字符串结果){
          super.onPostExecute(结果);
          如果(结果== NULL)
          {
              Toast.makeText(Login.this,结果是空值时出错,Toast.LENGTH_SHORT).show();
            }
          其他{              结果= result.trim();
         Log.d(检查,在这里);
            Log.d(响应,响应);
         如果(response.toLowerCase()。包含(berhasil))
                {
                    字符串NAMA = username.getText()的toString()。
                    意图newIntent =新意图(Login.this,MainPage.class);                    束束=新包();                    bundle.putString(非农产品市场准入,NAMA);                    newIntent.putExtras(包);
                    startActivityForResult(newIntent,0);
                }
                其他
                {
                    //可选
                    // Kalau BISA dibuat不断untuk menghindari萨拉赫penulisan
                    字符串RoleError =角色SALAH
                    字符串UserError =USER SALAH                    createDialog(MAAF,response.equals(RoleError)角色安达bukan学生!?!用户名密码Atau萨拉赫);
                }
          }
      }
    }
    私人无效createDialog(标题字符串,字符串文本){
        AlertDialog广告=新AlertDialog.Builder(本)
        .setPositiveButton(OK,NULL)
        .setTitle(职称)
        .setMessage(文本)
        。创建();
        ad.show();
    }
}

logcat的 - 当我在设备测试

  06-10 17:34:43.715:D / TextLayoutCache(13251):使用调试级别:0  - 调试启用:0
06-10 17:34:43.786:D / libEGL(13251):加载/vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
06-10 17:34:43.793:D / libEGL(13251):加载/vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
06-10 17:34:43.801:D / libEGL(13251):加载/vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
06-10 17:34:43.918:D / OpenGLRenderer(13251):启用调试模式0
06-10 17:34:45.090:D / TryLoginCheck(13251):在这里
06-10 17:34:45.098:我/的System.out(13251):用户名
06-10 17:34:45.098:我/的System.out(13251):密码
06-10 17:34:45.098:D /参数(13251):用户名=放大器;密码=

logcat-闻一上测试模拟器

  06-10 17:37:34.375:I /流程(451):发送信号。 PID:451 SIG:9
06-10 17:43:06.032:W / KeyCharacterMap(488):无键盘ID 0
06-10 17:43:06.032:W / KeyCharacterMap(488):使用默认的键盘对应:/system/usr/keychars/qwerty.kcm.bin
06-10 17:43:19.961:D / TryLoginCheck(488):在这里
06-10 17:43:19.963:我/的System.out(488):UserNametes
06-10 17:43:19.963:我/的System.out(488):passwordTes12345 *
06-10 17:43:19.963:D /参数(488):用户名= TES和放大器;密码= Tes12345 *
06-10 17:43:20.343:D /温度(488):登录Berhasil dengan的userid ='3'
06-10 17:43:20.343:D /响应(488):登录Berhasil dengan的userid ='3'
06-10 17:43:20.343:D / SB值(488):登录Berhasil dengan的userid ='3'
06-10 17:43:20.343:D /检查(488):在这里
06-10 17:43:20.343:D / AndroidRuntime(488):关闭VM
06-10 17:43:20.343:W / dalvikvm(488):主题ID = 1:螺纹未捕获的异常(组= 0x40015560)退出
06-10 17:43:20.363:E / AndroidRuntime(488):致命异常:主要
06-10 17:43:20.363:E / AndroidRuntime(488):显示java.lang.NullPointerException:需要的println消息
06-10 17:43:20.363:E / AndroidRuntime(488):在android.util.Log.println_native(本机方法)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.util.Log.d(Log.java:137)
06-10 17:43:20.363:E / AndroidRuntime(488):在com.karismaelearning.Login $ LoginTask.onPostExecute(Login.java:163)
06-10 17:43:20.363:E / AndroidRuntime(488):在com.karismaelearning.Login $ LoginTask.onPostExecute(Login.java:1)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.os.AsyncTask.finish(AsyncTask.java:417)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.os.AsyncTask.access $ 300(AsyncTask.java:127)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:429)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.os.Handler.dispatchMessage(Handler.java:99)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.os.Looper.loop(Looper.java:123)
06-10 17:43:20.363:E / AndroidRuntime(488):在android.app.ActivityThread.main(ActivityThread.java:3683)
06-10 17:43:20.363:E / AndroidRuntime(488):在java.lang.reflect.Method.invokeNative(本机方法)
06-10 17:43:20.363:E / AndroidRuntime(488):在java.lang.reflect.Method.invoke(Method.java:507)
06-10 17:43:20.363:E / AndroidRuntime(488):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
06-10 17:43:20.363:E / AndroidRuntime(488):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-10 17:43:20.363:E / AndroidRuntime(488):在dalvik.system.NativeStart.main(本机方法)


解决方案

您是与结果令人困惑响应。在onPostExecute(字符串结果)结果是从你的异步执行在doInBackground()的结果。 LoginTask的响应成员变量从未使用过,我不明白你为什么会想它。删除它,并使用结果。

my AsyncTask codes return null when try to login. I got confused, why on device it can throw the toast "return null..." but on emulator it force close, anyone please help me to fix this. thank you very much

login.java

public class Login extends Activity {
    public Koneksi linkurl;
    String SERVER_URL;
    private Button login, register, setting;
    private EditText username, password;
    public ProgressDialog progressDialog;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        setting = (Button)findViewById(R.id.bsetting);
        login = (Button) findViewById(R.id.login);
        register = (Button) findViewById(R.id.reg);
        username = (EditText) findViewById(R.id.uname);
        password = (EditText) findViewById(R.id.pass);

        setting.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intentSet = new Intent(Login.this, UrlSetting.class);
                startActivity(intentSet);
            }
        });

        register.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intentReg = new Intent(Login.this, Register.class);
                startActivity(intentReg);
            }
        });

        login.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub

               new LoginTask().execute();



            }
        });


    }
    protected String tryLogin(String mUsername, String mPassword)
    {           
      Log.d(" TryLoginCheck ","Here");
        HttpURLConnection connection;
       OutputStreamWriter request = null;

            URL url = null;
            String response = null;   
            String temp=null;
            String parameters = "username="+mUsername+"&password="+mPassword;   
            System.out.println("UserName"+mUsername+"\n"+"password"+mPassword);
            Log.d("Parameters",parameters);
            try
            {
                ;
                linkurl = new Koneksi(this);
                SERVER_URL = linkurl.getUrl();
                SERVER_URL += "/mobile/Login.php";
                url = new URL(SERVER_URL);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setRequestMethod("POST");    

                request = new OutputStreamWriter(connection.getOutputStream());
                request.write(parameters);
                request.flush();
                request.close();            
                String line = "";               
                InputStreamReader isr = new InputStreamReader(connection.getInputStream());
                BufferedReader reader = new BufferedReader(isr);
                StringBuilder sb = new StringBuilder();
                while ((line = reader.readLine()) != null)
                {

                    sb.append(line + "\n");
                }
                temp=sb.toString();
                Log.d("Temp",temp);

                response = sb.toString();
                Log.d("Response",response);
               Log.d("Sb Value",sb.toString());
                isr.close();
                reader.close();


            }
            catch(IOException e)
            {
                e.printStackTrace();
                Log.d("Error",e.getMessage());
                return null;
            }

            return response;
    }

    public class LoginTask extends AsyncTask<String, String, String> {

        String response = null;

        @Override
        protected void onPreExecute()
        {

        }
        @Override
        protected String doInBackground(String... arg0)
        {
            String mUsername = username.getText().toString();
               String mPassword = password.getText().toString();          
               return tryLogin(mUsername, mPassword);
        }
      protected void onPostExecute(String result){
          super.onPostExecute(result);
          if(result==null)
          {
              Toast.makeText(Login.this,"result is null- an error occured",Toast.LENGTH_SHORT).show();
            } 
          else{

              result = result.trim();
         Log.d("Check","Here");
            Log.d("Response",response);
         if(response.toLowerCase().contains("berhasil"))
                {
                    String nama = username.getText().toString();
                    Intent newIntent = new Intent(Login.this, MainPage.class);

                    Bundle bundle = new Bundle();

                    bundle.putString("nama", nama);

                    newIntent.putExtras(bundle);
                    startActivityForResult(newIntent, 0);
                }
                else
                {
                    //Optional
                    //Kalau bisa dibuat constant untuk menghindari salah penulisan
                    String RoleError = "ROLE SALAH";
                    String UserError = "USER SALAH";

                    createDialog("Maaf", response.equals(RoleError) ? "Role Anda bukan Student!" : "Username Atau Password Salah!");
                }
          }
      }
    }
    private void createDialog(String title, String text) {
        AlertDialog ad = new AlertDialog.Builder(this)
        .setPositiveButton("Ok", null)
        .setTitle(title)
        .setMessage(text)
        .create();
        ad.show();
    }
}

Logcat - when I test in device

06-10 17:34:43.715: D/TextLayoutCache(13251): Using debug level: 0 - Debug Enabled: 0
06-10 17:34:43.786: D/libEGL(13251): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
06-10 17:34:43.793: D/libEGL(13251): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
06-10 17:34:43.801: D/libEGL(13251): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
06-10 17:34:43.918: D/OpenGLRenderer(13251): Enabling debug mode 0
06-10 17:34:45.090: D/TryLoginCheck(13251): Here
06-10 17:34:45.098: I/System.out(13251): UserName
06-10 17:34:45.098: I/System.out(13251): password
06-10 17:34:45.098: D/Parameters(13251): username=&password=

logcat- wen i test on emulator

06-10 17:37:34.375: I/Process(451): Sending signal. PID: 451 SIG: 9
06-10 17:43:06.032: W/KeyCharacterMap(488): No keyboard for id 0
06-10 17:43:06.032: W/KeyCharacterMap(488): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
06-10 17:43:19.961: D/TryLoginCheck(488): Here
06-10 17:43:19.963: I/System.out(488): UserNametes
06-10 17:43:19.963: I/System.out(488): passwordTes12345*
06-10 17:43:19.963: D/Parameters(488): username=tes&password=Tes12345*
06-10 17:43:20.343: D/Temp(488): Login Berhasil dengan userid='3'
06-10 17:43:20.343: D/Response(488): Login Berhasil dengan userid='3'
06-10 17:43:20.343: D/Sb Value(488): Login Berhasil dengan userid='3'
06-10 17:43:20.343: D/Check(488): Here
06-10 17:43:20.343: D/AndroidRuntime(488): Shutting down VM
06-10 17:43:20.343: W/dalvikvm(488): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-10 17:43:20.363: E/AndroidRuntime(488): FATAL EXCEPTION: main
06-10 17:43:20.363: E/AndroidRuntime(488): java.lang.NullPointerException: println needs a message
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.util.Log.println_native(Native Method)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.util.Log.d(Log.java:137)
06-10 17:43:20.363: E/AndroidRuntime(488):  at com.karismaelearning.Login$LoginTask.onPostExecute(Login.java:163)
06-10 17:43:20.363: E/AndroidRuntime(488):  at com.karismaelearning.Login$LoginTask.onPostExecute(Login.java:1)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.os.AsyncTask.finish(AsyncTask.java:417)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.os.AsyncTask.access$300(AsyncTask.java:127)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.os.Looper.loop(Looper.java:123)
06-10 17:43:20.363: E/AndroidRuntime(488):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-10 17:43:20.363: E/AndroidRuntime(488):  at java.lang.reflect.Method.invokeNative(Native Method)
06-10 17:43:20.363: E/AndroidRuntime(488):  at java.lang.reflect.Method.invoke(Method.java:507)
06-10 17:43:20.363: E/AndroidRuntime(488):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-10 17:43:20.363: E/AndroidRuntime(488):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-10 17:43:20.363: E/AndroidRuntime(488):  at dalvik.system.NativeStart.main(Native Method)

解决方案

You're confusing 'response' with 'result'. In onPostExecute(String result) 'result' is the result from your asynchronous execution in doInBackground(). The response member variable of LoginTask is never used and I do not see why you'd want it at all. Remove it and use 'result'.

这篇关于在AsyncTask的得到空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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