Java 由于NetworkOnMainthread异常,无法将文档插入mongodb数据库

Java 由于NetworkOnMainthread异常,无法将文档插入mongodb数据库,java,android,mongodb,Java,Android,Mongodb,我正在制作一个android应用程序,从用户那里获取数据并将其存储在mongodb数据库中 mongodb在localhost:27017上运行,我可以在genymotion emulator上使用10.0.3.2:27017连接到它 下面是LoginActivity.java import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; impo

我正在制作一个android应用程序,从用户那里获取数据并将其存储在mongodb数据库中

mongodb在localhost:27017上运行,我可以在genymotion emulator上使用10.0.3.2:27017连接到它

下面是LoginActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import org.bson.Document;
import org.json.JSONException;
import org.json.JSONObject;

public class LoginActivity extends AppCompatActivity {

    static DB db;
    static DBCollection locations;

    public String name,middlename,surname,userid,profilelink,imageUrl,emailid,gender,birthday;
    private CallbackManager callbackManager;
    private AccessTokenTracker accessTokenTracker;
    private ProfileTracker profileTracker;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_login);

        callbackManager = CallbackManager.Factory.create();
        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) {
            }
        };
        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) {
                nextActivity(newProfile);
            }
        };
        accessTokenTracker.startTracking();
        profileTracker.startTracking();


        LoginButton loginButton = (LoginButton)findViewById(R.id.login_button);
        FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {

                Profile profile = Profile.getCurrentProfile();
                nextActivity(profile);



                GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                Log.v("JSON",response.toString());

                                try {
                                    emailid=object.getString("email");
                                    gender=object.getString("gender");
                                    birthday=object.getString("birthday");

                                    TextView nameView6 = (TextView)findViewById(R.id.emailr);
                                    nameView6.setText(emailid);
                                    TextView nameView7 = (TextView)findViewById(R.id.genderr);
                                    nameView7.setText(gender);
                                    TextView nameView8 = (TextView)findViewById(R.id.birthdayr);
                                    nameView8.setText(birthday);

                                    String[] dset={emailid,gender,birthday};
                                    yalla(dset);

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        });

                Bundle parameters = new Bundle();
                parameters.putString("fields", "email,gender,birthday");
                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
            }

            @Override
            public void onError(FacebookException e) {
            }
        };
        loginButton.setReadPermissions("user_friends");
        loginButton.setReadPermissions("public_profile");
        loginButton.setReadPermissions("email");
        loginButton.setReadPermissions("user_birthday");
        loginButton.registerCallback(callbackManager, callback);
    }


    @Override
    protected void onResume() {
        super.onResume();
        //Facebook login
        Profile profile = Profile.getCurrentProfile();
        nextActivity(profile);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    protected void onStop() {
        super.onStop();
        accessTokenTracker.stopTracking();
        profileTracker.stopTracking();
    }

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
        super.onActivityResult(requestCode, responseCode, intent);
        callbackManager.onActivityResult(requestCode, responseCode, intent);

    }

    private void nextActivity(Profile profile){
        if(profile != null){
            Intent main = new Intent(LoginActivity.this, MainActivity.class);
            main.putExtra("name", profile.getFirstName());
            main.putExtra("middlename", profile.getMiddleName());
            main.putExtra("surname", profile.getLastName());
            main.putExtra("userid", profile.getId());
            main.putExtra("profilelink", profile.getLinkUri());
            main.putExtra("imageUrl", profile.getProfilePictureUri(200,200).toString());
            startActivity(main);
        }
    }

    public static void yalla(String[] args){
        String[] dset;
        dset=args;

        //try {
        String uri = "mongodb://10.0.3.2:27017";
        Log.v("enterhere", dset[0]);
        MongoClientURI mongoClientURI=new MongoClientURI(uri);
        //MongoClient mongoClient = new MongoClient("mongodb://10.0.3.2:27017/test");
        Log.v("connectedserver", dset[0]);
        MongoClient mongoClient = new MongoClient(mongoClientURI);
        MongoDatabase database = mongoClient.getDatabase("users");
        Log.v("Connect to database successfully",database.getName());
        MongoCollection mongoCollection = database.getCollection("assest");
        Log.v("collection", dset[0]);

            Document doc = new Document("emailid", dset[0])
                    .append("gender", dset[1])
                    .append("birthday", dset[2]);
            Log.v("document update", dset[0]);
            mongoCollection.insertOne(doc);
            Log.v("doc insertion", dset[0]);
            mongoClient.close();
        //} catch (MongoException e)
        //{
        //    e.getStackTrace();
        //}
         }
}

您可以为此使用异步任务。我对mongoDB了解不多,但假设您的
yalla
方法有大量的网络操作,其中包括mongoDB

尝试将
yalla
方法添加到新任务中

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {

      //Include your mongoDB accessing method here, in background thread.

 }
 }
希望这有帮助

EDIT:现在您将您的方法包括在AsyncTask中,并将
URL
作为参数传递,只需通过
execute()
方法提供链接即可。无需使用此
字符串[]=args
,您当前正在Methodos中使用此字符串


有关AsyncTask的更多详细信息,请参阅

中的官方文档。您可以使用AsyncTask进行此操作。我对mongoDB了解不多,但假设您的
yalla
方法有大量的网络操作,其中包括mongoDB

尝试将
yalla
方法添加到新任务中

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {

      //Include your mongoDB accessing method here, in background thread.

 }
 }
希望这有帮助

EDIT:现在您将您的方法包括在AsyncTask中,并将
URL
作为参数传递,只需通过
execute()
方法提供链接即可。无需使用此
字符串[]=args
,您当前正在Methodos中使用此字符串


有关AsyncTask的更多详细信息,请参阅来自

的官方文档。我实际上也在尝试这样做,但发现mongoclient无法工作,因此我使用了common类在mlab上连接到我的服务器,然后使用asynkTask内部类和HTTPUrlConnection来获取我存储的数据,请查看此链接以查询mlab的URL-> 也请查看此->


我实际上也在尝试这样做,发现mongoclient无法工作,所以我使用了common类在mlab上连接到我的服务器,然后我使用带有HTTPUrlConnection的asynkTask内部类来获取我存储的数据,查看此链接以查询mlab的URL-> 也请查看此->


谢谢,顺便说一句,我将如何将字符串转换为url,我尝试了新url(字符串),但它返回Null请参考此答案以解答您的疑问:url-from-a-string谢谢,顺便说一句,我将如何将字符串转换为url,我尝试了新url(字符串),但它返回Null请参考此答案以解答您的疑问:url-from-a-string
new DownloadFilesTask().execute(url1, url2, url3);
 public class Common {
private static String DB_NAME = "edmtdev";
private static String COLLECTION_NAME =        "user";
public static String API_KEY = "YOUR API   KEY";

public static String getAddressSingle(User user)    {
String baseUrl =       String.format("https://api.mlab.com/api/1/databases/%s/collections/%s", DB_NAME,  COLLECTION_NAME);
 StringBuilder stringBuilder = new   StringBuilder(baseUrl);
    stringBuilder.append("/"+user.get_id().getOid()+"?apiKey="+API_KEY);
return stringBuilder.toString():
}