URL的异步参数

时间:2014-12-04 14:11:02

标签: android json avd

长话短说。 这是我正在关注的教程, 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;
    }



}

2 个答案:

答案 0 :(得分:0)

仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是非常不鼓励这样做。因此,如果您的AVD在SDK下运行,则不会抛出Honeycomb NetworkOnMainThreadException。

你应该在后台线程上做网络工作。您可以使用许多工具来实现这一目标,仅举几例:AsyncTask,ThreadPoolExecutor,简单的新线程等。

答案 1 :(得分:0)

Android不允许主线程上的网络操作。这是因为主线程上的网络操作将锁定UI。

对于我在android上的大多数网络调用,我使用了一个内置于Android中的名为AsyncTask的帮助程序。

  

AsyncTask可以正确,轻松地使用UI线程。这个班   允许执行后台操作并在UI上发布结果   线程,而不必操纵线程和/或处理程序。

Here是学习如何实现AsyncTask的好教程