-2

我正在尝试在 android 中开发登录模块,因为我在服务器端创建了表并返回返回用户 ID、用户名和密码的 json 响应。我使用 Asynctask 连接到 url 并在 doInBackground() 中从服务器读取数据。当我运行程序它显示登录不成功消息。我不知道为什么它显示。我做了很多研发,但我没有得到解决方案。这是我的完整源代码

package com.example.tours;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class login extends Activity implements OnClickListener
{


    Button btnback,btnlog;
    EditText e1,e2;
    List<NameValuePair>nameValuePairs;
    ProgressDialog progressdialog;
    InputStream is=null;
    JSONObject jsonobject=null;
    String Json="";
    String oneObjectsItem="";
    String oneObjectsItem2="";
    String oneObjectsItem3="";

    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        e1=(EditText)findViewById(R.id.editTextuser);
        e2=(EditText)findViewById(R.id.editTextpass);


        btnback=(Button)findViewById(R.id.btnback);
        btnlog=(Button)findViewById(R.id.btnlogin);
        btnback.setOnClickListener(this);
        btnlog.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) 
    {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
        case R.id.btnback:Intent i=new Intent(login.this,MainActivity.class);
        startActivity(i);
        break;
        case R.id.btnlogin:// check username and pass so point to php file and build param

            new CallAsyncTask().execute();
            }

        }

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

            @Override
            protected String doInBackground(String... arg0) 
            {
                // TODO Auto-generated method stub
                // code for checking user name and password
                try
                {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://deepakg0.0fees.net/login.php");
                // Build The parameter
                nameValuePairs = new ArrayList<NameValuePair>(2);
                nameValuePairs.add(new BasicNameValuePair("UserName",e1.getText().toString()));
                nameValuePairs.add(new BasicNameValuePair("UserPass",e2.getText().toString()));

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                // generate responce
                HttpResponse  response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                }
                catch(Exception e1)
                {
                    Toast.makeText(getBaseContext(), "Errror"+e1.toString(), Toast.LENGTH_LONG).show();
                }
                //read the responce into string
                try
                {
                  BufferedReader reader=new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                  StringBuilder builder=new StringBuilder();
                  String line=null;
                  while((line=reader.readLine())!=null)
                  {
                      builder.append(line+"\n");
                  }
                  is.close();
                  Json=builder.toString();
                }
                catch(Exception e2 )
                {
                    Log.d("Buffer","failed"+e2.toString());
                }
                // create the json object
                try
                {
                jsonobject = new JSONObject(Json);
                JSONArray jArray = jsonobject.getJSONArray("result");
                // iterate through the array and fetch the keys
                for(int i=0;i<jArray.length();i++)
                {
                    // fetch the object and their keys
                    JSONObject oneObject = jArray.getJSONObject(i);
                    // Pulling items from the array
                     oneObjectsItem = oneObject.getString("uid");
                     oneObjectsItem2 = oneObject.getString("username");
                     oneObjectsItem3 = oneObject.getString("password");
                }
                }
                catch(Exception e3)
                {
                    Log.d("InJson","error"+e3.toString());

                }
                if((e1.getText().toString().equalsIgnoreCase(oneObjectsItem2)&&(e1.getText().toString().equalsIgnoreCase(oneObjectsItem2))))
                {
                        Toast.makeText(getApplicationContext(),"Login Successfull",Toast.LENGTH_LONG).show();

                }
                else
                {
                        Toast.makeText(getApplicationContext(),"Login Unsuccessfull",Toast.LENGTH_LONG).show();
                 }

                return null;
            }

            @Override
            protected void onPostExecute(String result) 
            {
                // TODO Auto-generated method stub              
                super.onPostExecute(result);

                Toast.makeText(getApplicationContext(),"Output"+Json,Toast.LENGTH_LONG).show();
                progressdialog.dismiss();
            }

            @Override
            protected void onPreExecute() 
            {
                // TODO Auto-generated method stub
                super.onPreExecute();
                progressdialog=new ProgressDialog(login.this);
                progressdialog.setMessage("Checking username and password please wait");

                //progressdialog.setIndeterminate(false);
                //progressdialog.setCancelable(false);
                progressdialog.show();
            }

        }

}

这是我的日志猫

09-11 18:33:50.809: E/AndroidRuntime(985): FATAL EXCEPTION: AsyncTask #1
09-11 18:33:50.809: E/AndroidRuntime(985): java.lang.RuntimeException: An error occured while executing doInBackground()
09-11 18:33:50.809: E/AndroidRuntime(985):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.lang.Thread.run(Thread.java:1096)
09-11 18:33:50.809: E/AndroidRuntime(985): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-11 18:33:50.809: E/AndroidRuntime(985):  at android.os.Handler.<init>(Handler.java:121)
09-11 18:33:50.809: E/AndroidRuntime(985):  at android.widget.Toast.<init>(Toast.java:68)
09-11 18:33:50.809: E/AndroidRuntime(985):  at android.widget.Toast.makeText(Toast.java:231)
09-11 18:33:50.809: E/AndroidRuntime(985):  at com.example.tours.login$CallAsyncTask.doInBackground(login.java:143)
09-11 18:33:50.809: E/AndroidRuntime(985):  at com.example.tours.login$CallAsyncTask.doInBackground(login.java:1)
09-11 18:33:50.809: E/AndroidRuntime(985):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-11 18:33:50.809: E/AndroidRuntime(985):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-11 18:33:50.809: E/AndroidRuntime(985):  ... 4 more
09-11 18:33:51.939: E/WindowManager(985): Activity com.example.tours.login has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44ea9be0 that was originally added here
09-11 18:33:51.939: E/WindowManager(985): android.view.WindowLeaked: Activity com.example.tours.login has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44ea9be0 that was originally added here
09-11 18:33:51.939: E/WindowManager(985):   at android.view.ViewRoot.<init>(ViewRoot.java:247)
09-11 18:33:51.939: E/WindowManager(985):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
09-11 18:33:51.939: E/WindowManager(985):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
09-11 18:33:51.939: E/WindowManager(985):   at android.view.Window$LocalWindowManager.addView(Window.java:424)
09-11 18:33:51.939: E/WindowManager(985):   at android.app.Dialog.show(Dialog.java:241)
09-11 18:33:51.939: E/WindowManager(985):   at com.example.tours.login$CallAsyncTask.onPreExecute(login.java:175)
09-11 18:33:51.939: E/WindowManager(985):   at android.os.AsyncTask.execute(AsyncTask.java:391)
09-11 18:33:51.939: E/WindowManager(985):   at com.example.tours.login.onClick(login.java:73)
09-11 18:33:51.939: E/WindowManager(985):   at android.view.View.performClick(View.java:2408)
09-11 18:33:51.939: E/WindowManager(985):   at android.view.View$PerformClick.run(View.java:8816)
09-11 18:33:51.939: E/WindowManager(985):   at android.os.Handler.handleCallback(Handler.java:587)
09-11 18:33:51.939: E/WindowManager(985):   at android.os.Handler.dispatchMessage(Handler.java:92)
09-11 18:33:51.939: E/WindowManager(985):   at android.os.Looper.loop(Looper.java:123)
09-11 18:33:51.939: E/WindowManager(985):   at android.app.ActivityThread.main(ActivityThread.java:4627)
09-11 18:33:51.939: E/WindowManager(985):   at java.lang.reflect.Method.invokeNative(Native Method)
09-11 18:33:51.939: E/WindowManager(985):   at java.lang.reflect.Method.invoke(Method.java:521)
09-11 18:33:51.939: E/WindowManager(985):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-11 18:33:51.939: E/WindowManager(985):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-11 18:33:51.939: E/WindowManager(985):   at dalvik.system.NativeStart.main(Native Method)
09-11 18:37:28.179: D/dalvikvm(1068): GC_FOR_MALLOC freed 3655 objects / 178624 bytes in 102ms
09-11 18:37:30.439: D/Buffer(1068): failedjava.lang.NullPointerException
09-11 18:37:30.449: D/InJson(1068): errororg.json.JSONException: End of input at character 0 of 
09-11 18:40:14.559: D/dalvikvm(1095): GC_FOR_MALLOC freed 3809 objects / 182976 bytes in 96ms
09-11 18:40:16.769: D/Buffer(1095): failedjava.lang.NullPointerException
09-11 18:40:16.769: D/InJson(1095): errororg.json.JSONException: End of input at character 0 of 
09-11 18:45:17.069: D/Buffer(1095): failedjava.lang.NullPointerException
09-11 18:45:17.069: D/InJson(1095): errororg.json.JSONException: End of input at character 0 of 
09-11 19:07:09.619: D/dalvikvm(1095): GC_FOR_MALLOC freed 5200 objects / 195696 bytes in 98ms
09-11 19:07:09.840: D/dalvikvm(1095): GC_FOR_MALLOC freed 881 objects / 411168 bytes in 167ms
09-11 19:07:12.139: D/Buffer(1095): failedjava.lang.NullPointerException
09-11 19:07:12.139: D/InJson(1095): errororg.json.JSONException: End of input at character 0 of 
09-11 19:07:12.219: D/Buffer(1095): failedjava.lang.NullPointerException
09-11 19:07:12.219: D/InJson(1095): errororg.json.JSONException: End of input at character 0 of 
4

3 回答 3

2

您正试图Thread从后台与驻留在 UI 中的 UI 组件进行交互Thread。doInBackGround() 在后台执行Thread。它旨在用于Thread当您执行长时间运行的任务(如网络交互)时 UI 保持响应。看看这个链接中的第 2 点。

于 2013-09-16T13:47:26.337 回答
1

您不能从该doInBackground方法制作 Toast,因为您只能从主线程修改 UI。在 AsyncTask 类之外创建一个方法,如下所示:

void toastFromMainThread(final String message, final int length){
    runOnUiThread(new Runnable(){
        public void run(){
            Toast.makeText(getApplicationContext(),message,length).show();
        }
    });
}

然后,当您希望从后台线程出现 toast 时,调用此方法而不是 Toast.makeText。

于 2013-09-16T13:50:56.757 回答
1

Toast从中消除doInBackground()。如果您想与 UI 交互,请使用onPostExecute() 例如:

public class YourClass extends AsyncTask<Void,Void,Void>{

    protected void onPreExecute(){
        super.onPreExecute();
        //
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        //your stuff
        return null;
    }

    protected void onPostExecute(Void q){
        super.onPostExecute(q);
        //notify user...
    }

}
于 2013-09-16T13:55:00.690 回答