我正在尝试使用以下方法在我的 Android 应用程序中实现登录功能卢肯代码的 RestClient 类。我有一个名为UserFunctions
通过 RestClient 检索 JSONObject:
public class UserFunctions {
private RestClient restClient;
private String json;
private Context mContext;
private static String login_tag = "login";
private static String register_tag = "register";
// constructor
public UserFunctions(Context context){
restClient = new RestClient("http://10.0.2.2:81/HGourmet/user");
mContext = context;
}
/**
* function make Login Request
* @param email
* @param password
* */
public JSONObject loginUser(String email, String password){
// Building Parameters
restClient.AddParam("tag", login_tag);
restClient.AddParam("email", email);
restClient.AddParam("password", password);
// getting JSON Object
try{
restClient.Execute(RequestMethod.POST);
}catch(Exception e){
e.printStackTrace();
}
json = restClient.getResponse();
JSONObject jObj = null;
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
以下是我在 logcat 中得到的内容:
01-06 09:01:05.805: E/Trace(1819): error opening trace file: No such file or directory (2)
01-06 09:02:05.485: E/AndroidRuntime(1819): FATAL EXCEPTION: main
01-06 09:02:05.485: E/AndroidRuntime(1819): java.lang.NullPointerException
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONObject.<init>(JSONObject.java:154)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONObject.<init>(JSONObject.java:171)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.hanu.hgourmet.library.UserFunctions.loginUser(UserFunctions.java:49)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.hanu.hgourmet.LoginActivity$1.onClick(LoginActivity.java:56)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.view.View.performClick(View.java:4202)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.view.View$PerformClick.run(View.java:17340)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Handler.handleCallback(Handler.java:725)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Handler.dispatchMessage(Handler.java:92)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Looper.loop(Looper.java:137)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-06 09:02:05.485: E/AndroidRuntime(1819): at java.lang.reflect.Method.invokeNative(Native Method)
01-06 09:02:05.485: E/AndroidRuntime(1819): at java.lang.reflect.Method.invoke(Method.java:511)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-06 09:02:05.485: E/AndroidRuntime(1819): at dalvik.system.NativeStart.main(Native Method)
我真的希望有人能帮助我找出这个问题的原因。非常感谢。
我不会详细说明您应该如何执行此操作,而只会详细说明为什么会发生这种情况。根据定义,AsyncTask 是异步的。这意味着当您执行它时,它会在不同的线程中并行完成其工作。所以你不能指望它会在之后立即终止execute()
已被调用(否则它将被称为SyncTask,并且没有任何理由存在)。
See AsyncTask
作为烤面包机。当您启动烤面包机(执行 AsyncTask)时,它会烤面包,但不会立即返回烤好的面包。需要一些时间来烘烤它。当它烤面包时,您可以做其他事情(因此不会完全冻结 UI 线程)。当它烤完你的面包时,它会用一个通知你ding!面包已经烤好了。这里也是同样的事情。你应该只开始使用json
(烤面包),当 AsyncTask 通知您它已完成执行时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)