2

Lukencodeの RestClient クラスを使用して、Android アプリにログイン機能を実装しようとしています。UserFunctionsRestClient を介して 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)

誰かがこの問題の理由を特定するのを手伝ってくれることを本当に願っています. どうもありがとうございました。

4

1 に答える 1

11

これをどのように行うべきかについては詳しく説明しませんが、なぜそれが発生するのかについてのみ説明します。AsyncTaskは、定義上、非同期です。これは、実行すると、別のスレッドで並行してジョブを実行することを意味します。したがって、呼び出された直後に終了することは期待できませんexecute()(そうでない場合は、 SyncTaskと呼ばれ、存在する理由はありません)。

AsyncTaskトースターとして見てください。トースターを起動すると(AsyncTaskを実行)、パンはトーストされますが、トーストされたパンはすぐには返されません。トーストには少し時間がかかります。パンを焼いている間、他のことをすることができます(したがって、UIスレッドを完全にフリーズすることはできません)。そして、パンのトーストが終わると、音が鳴ります!パンがトーストされていること。ここでも同じです。jsonAsyncTaskが実行を終了したことを通知した場合にのみ、(トーストしたパン)の使用を開始する必要があります。

于 2013-01-06T09:06:40.020 に答える