0

痕跡:

04-23 18:21:28.380: D/dalvikvm(628): GC_FOR_ALLOC freed 48K, 4% free 6396K/6595K, paused 76ms
04-23 18:21:28.390: I/dalvikvm-heap(628): Grow heap (frag case) to 6.797MB for 513744-byte allocation
04-23 18:21:28.520: D/dalvikvm(628): GC_FOR_ALLOC freed 3K, 4% free 6894K/7111K, paused 81ms
04-23 18:21:28.660: D/dalvikvm(628): GC_CONCURRENT freed <1K, 4% free 6894K/7111K, paused 4ms+13ms
04-23 18:22:09.350: D/AndroidRuntime(628): Shutting down VM
04-23 18:22:09.350: W/dalvikvm(628): threadid=1: thread exiting with uncaught exception (group=0x40014760)
04-23 18:22:09.370: E/AndroidRuntime(628): FATAL EXCEPTION: main
04-23 18:22:09.370: E/AndroidRuntime(628): android.os.NetworkOnMainThreadException
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
04-23 18:22:09.370: E/AndroidRuntime(628):  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:368)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
04-23 18:22:09.370: E/AndroidRuntime(628):  at java.net.Socket.connect(Socket.java:901)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-23 18:22:09.370: E/AndroidRuntime(628):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
04-23 18:22:09.370: E/AndroidRuntime(628):  at library.JSONParser.getJSONFromUrl(JSONParser.java:42)
04-23 18:22:09.370: E/AndroidRuntime(628):  at library.UserFunctions.registerUser(UserFunctions.java:61)
04-23 18:22:09.370: E/AndroidRuntime(628):  at com.example.AndroidLoginAndRegistration.RegisterActivity$1.onClick(RegisterActivity.java:55)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.view.View.performClick(View.java:3110)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.view.View$PerformClick.run(View.java:11934)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.os.Handler.handleCallback(Handler.java:587)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.os.Looper.loop(Looper.java:132)
04-23 18:22:09.370: E/AndroidRuntime(628):  at android.app.ActivityThread.main(ActivityThread.java:4123)
04-23 18:22:09.370: E/AndroidRuntime(628):  at java.lang.reflect.Method.invokeNative(Native Method)
04-23 18:22:09.370: E/AndroidRuntime(628):  at java.lang.reflect.Method.invoke(Method.java:491)
04-23 18:22:09.370: E/AndroidRuntime(628):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-23 18:22:09.370: E/AndroidRuntime(628):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-23 18:22:09.370: E/AndroidRuntime(628):  at dalvik.system.NativeStart.main(Native Method)
04-23 18:22:12.530: I/Process(628): Sending signal. PID: 628 SIG: 9

コード:

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import android.content.Context;

public class UserFunctions {

private JSONParser jsonParser;

// Testing in localhost using wamp or xampp
// use http://10.0.2.2/ to connect to your localhost ie http://localhost/
private static String loginURL = "http://10.0.2.2/android_login_api/";
private static String registerURL = "http://10.0.2.2/android_login_api/";

private static String login_tag = "login";
private static String register_tag = "register";

// constructor
public UserFunctions(){
    jsonParser = new JSONParser();
}

/**
 * function make Login Request
 * @param email
 * @param password
 * */
public JSONObject loginUser(String email, String password){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", login_tag));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));
    JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
    // return json
    // Log.e("JSON", json.toString());
    return json;
}

/**
 * function make Login Request
 * @param name
 * @param email
 * @param password
 * */
public JSONObject registerUser(String name, String email, String password){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", register_tag));
    params.add(new BasicNameValuePair("name", name));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));

    // getting JSON Object
    JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
    // return json
    return json;
}

/**
 * Function get Login status
 * */
public boolean isUserLoggedIn(Context context){
    DatabaseHandler db = new DatabaseHandler(context);
    int count = db.getRowCount();
    if(count > 0){
        // user logged in
        return true;
    }
    return false;
}

/**
 * Function to logout user
 * Reset Database
 * */
public boolean logoutUser(Context context){
    DatabaseHandler db = new DatabaseHandler(context);
    db.resetTables();
    return true;
}

logcat の出力は上部にあります。その下にあるのは、私の最善の努力にもかかわらず機能しないユーザー関数のコードです。URLをlocalhostに変更しようとしましたが、データをxamppに保存する代わりにクラッシュします。ライブラリ ビットに JSONParse と DataBaseHandler がありますが、どこに問題があるのか​​わかりません。エラー メッセージが表示されるのではなく、ログイン ページでさえ単にクラッシュします。必要なすべての php ファイルが存在することを確認しました。

4

2 に答える 2

0

メインスレッドでネットワーク操作を実行しています。少なくとも ICS ではこれは許可されておらず、その例外が発生します。Android 2.3.3 用のアプリケーションを開発しているときに同じ問題が発生しましたが、4.0.3 では問題なくクラッシュしていました。

あなたのアプローチはいくつかの重要な変更を加える必要があるため、変更されたコードを提供することはできません。ログイン用の関数を実行して別のスレッドで登録する必要があり、それらを呼び出す方法がわかりません。それぞれにスレッドを作成するのは簡単ですが、メソッドから結果を返すことはできません。

適切な実装は、それらを別のスレッドで実行し、結果が得られたときにメイン スレッドに通知することです。通知を送信する 1 つの方法は、新しく作成されたスレッドに渡される Handler を使用することです。ここで例を見つけました:http://www.helloandroid.com/tutorials/progressbar-updating-using-message-handler

于 2012-04-23T19:34:31.863 に答える
0

NetworkOnMainThreadException

これは、Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。

Android はDownloadFilesTaskを追加しました。DownloadFilesTask を使用する必要があります。

 private class LoginTask extends AsyncTask<String, Integer, Long> {
 private private static String loginURL = "http://10.0.2.2/android_login_api/"; //remove other one
 protected JSONObject doInBackground(String... params) {
     List<NameValuePair> params = new ArrayList<NameValuePair>();
     for(int i=0; i<params.length; i+=2){ //increment i by length of pair(2)
         params.add(new BasicNameValuePair(params[i], params[i+1])); 
     }
     return jsonParser.getJSONFromUrl(loginURL, params);
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }

ログイン機能を変更します。これから

public JSONObject loginUser(String email, String password){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", login_tag));
    params.add(new BasicNameValuePair("email", email));
    params.add(new BasicNameValuePair("password", password));
    JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
    // return json
    // Log.e("JSON", json.toString());
    return json;
}

これに

public JSONObject loginUser(String email, String password){
    // Building Parameters
    String[] params = {"tag", login_tag, "email", email, "password", password};
    JSONObject json = new LoginTask().execute(params);
    return json;
}

ちょっとしたハックです。時間に追われています。独自のタスクを使用して、各関数に対して同様のことを行う必要があります。文字列配列の最初のパラメーターが実行したい関数である場合は、よりモジュール化できます。次に、ダウンロード タスクでいくつかのブランチを使用して、関数 getJSONFromUrl に渡す URL を決定します。

于 2012-04-23T18:44:13.767 に答える