2012-04-23 57 views
0

跟蹤:應用盡快crashs我點擊註冊

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文件都存在。

+0

發佈錯誤堆棧跟蹤。 – kosa 2012-04-23 18:11:54

+0

post [logcat](http://developer.android.com/guide/developing/tools/logcat.html)轉儲 – 2012-04-23 18:12:11

+0

我已經發布logcat的東西,現在... – titar 2012-04-23 18:25:42

回答

0

NetworkOnMainThreadException

這只是拋出應用針對蜂窩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。

+0

非常感謝....會嘗試讓你知道,它是怎麼回事! – titar 2012-04-23 18:51:46

+0

和,如果你不介意可以郵寄給你單獨的項目只是用這些東西,所以你可以看看嗎? :) – titar 2012-04-23 18:53:46

+0

給我一些時間來做一個例子proj – JustinDanielson 2012-04-23 19:02:50

0

您正在主線程上運行網絡操作。至少在ICS中這是不允許的,你會得到這個例外。我在爲Android 2.3.3開發應用程序時遇到了同樣的問題,但它在4.0.3上很好,但崩潰了。

我無法爲您提供修改後的代碼,因爲您的方法必須進行一些重大更改。您必須運行登錄函數並在另一個線程上註冊,並且不知道如何調用它們。在它們中的每一箇中創建一個線程都很容易,但從該方法返回結果是不可能的。

正確的實現是在不同的線程上運行它們,並在獲得結果時通知主線程。發送通知的一種方法是使用傳遞給新創建線程的Handler。我在這裏找到一個示例:http://www.helloandroid.com/tutorials/progressbar-updating-using-message-handler