Java 由于NetworkOnMainthread异常,无法将文档插入mongodb数据库
我正在制作一个android应用程序,从用户那里获取数据并将其存储在mongodb数据库中 mongodb在localhost:27017上运行,我可以在genymotion emulator上使用10.0.3.2:27017连接到它 下面是LoginActivity.javaJava 由于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
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():
}