长话短说。 这是我正在关注的教程, http://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/
我在mysql上的本地主机上运行它,它在AVD上工作正常。
现在在分析了代码之后,我创建了一个与教程结构完全相同的mysql数据库,当然还有我在hostgator帐户上的网页。
然后当我尝试运行应用程序并尝试注册帐户时,我的应用程序一直崩溃,我得到了
android.os.NetworkOnMainThreadException
所以我理解我需要拥有ASYNC,以便此任务可以在后台完成,而不是在主UI线程上完成。但我的问题是为什么它能够在localhost上工作得很好?
现在我的实际问题是,我必须提供的ASYNC的参数在哪里?我想我应该在一个共同的地方,如果你参考上面的教程,有JSON解析器类吗? 所以下面是UserFunction类,如果你已经看到上面的教程这是类之一,但不同的是我试图使登录任务到ASYNTASK并且难以理解,ASYNC任务,是的我已经看过google文档但是仍然无法弄清楚为我的案子提出的论点。帮助赞赏tks,通过输入断点和记录以了解内部结构,我很容易从完整的代码中理解。
My UserFunctions Class
package databasehandler;
/**
* Created by YP on 26-Nov-14.
*/
import java.net.URL;
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;
import android.content.Intent;
import android.os.AsyncTask;
import com.techiequickie.bharath.boadraf.Loginactivity;
import com.techiequickie.bharath.boadraf.choose_task;
public class UserFunctions
{
private JSONParser jsonParser;
public static String loginURL = "http://techiequickie.com/android_login_api/";
private static String registerURL = "http://techiequickie.com/android_login_api/";
private static String login_tag = "login";
private static String register_tag = "register";
// constructor
public UserFunctions(){
jsonParser = new JSONParser();
}
private class myAsynTask extends AsyncTask <URL, Void, String >
{
@Override
protected String doInBackground(URL... params)
{
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);
}
protected void onPostExecute(String result)
{
if(result.equals("1"))
{
Intent i = new Intent(UserFunctions.this,choose_task.class);
startActivity(i);
}
}
}
/**
* 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,String preffered_username){
// 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));
params.add(new BasicNameValuePair("preffered", preffered_username));
// 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;
}
}
答案 0 :(得分:0)
仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。因此,如果您的AVD在SDK下运行,则不会抛出Honeycomb NetworkOnMainThreadException。
你应该在后台线程上做网络工作。您可以使用许多工具来实现这一目标,仅举几例:AsyncTask,ThreadPoolExecutor,简单的新线程等。
答案 1 :(得分:0)