2016-11-08 4 views
-1

Ich habe eine asyncTask in meiner Anwendung als unten. Ich muss Daten von Realm (die erfolgreich in einer anderen Aktivität gespeichert wurde) in diese AsyncTask abrufen. Unten ist mein AsyncTask Code: - „nur Realm Zugriff von falschen Thread Realm Objekte auf dem Thread zugegriffen werden kann, sie erstellt wurden.“Android, wie Realm in AsyncTask initiieren?

public class MakeAsyncRequest extends AsyncTask<Object, String, MakeAsyncRequest.ResponseDataType>{ 

public Context asyncContext; 
    private MakeAsyncRequest(Context context){ 
     asyncContext = context; 
    } 

private static final OkHttpClient client = new OkHttpClient(); 
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 

private MakeRequest.ResponseHandler handler; 
private String method; 
private User user; 
private Realm realm; 


class ResponseDataType 
{ 
    InputStream inputStream; 
    String string; 
    String cookie; 
} 
MakeAsyncRequest(MakeRequest.ResponseHandler responseHandler, String type) 
{ 
    method = type; 
    handler = responseHandler; 
} 


@Override 

protected ResponseDataType doInBackground(Object... params) { 
    try { 
     Requests requests = new Requests((Context) params[0]); 
     String url = params[1].toString(); 
     String bodyJson = null; 
     if(method.equals("PUT") || method.equals("POST")) { 
      bodyJson = params[2].toString(); 
     } 
     final Request.Builder builder; 
     Response response; 
     RequestBody body; 
     switch (method) { 

      case "GET": builder = new Request.Builder().url(url); 
       break; 

      case "DOWNLOAD": builder = new Request.Builder().url(url); 
       break; 

      case "POST": body = RequestBody.create(JSON, bodyJson); 
       builder = new Request.Builder() 
         .url(url) 
         .post(body) 
         .addHeader("Cookie", "key=value"); 
       break; 

      case "PUT": body = RequestBody.create(JSON, bodyJson); 
       builder = new Request.Builder() 
         .url(url) 
         .put(body); 
       break; 

      default: builder = new Request.Builder().url(url); 
     } 
     builder.addHeader("Accept", "application/json"); 
     realm = RealmController.initialize(this).getRealm(); 
     final RealmResults<User> users = realm.where(User.class).findAllAsync(); 
     user = users.first(); 
     if(user.getCookie() !== null && !user.getCookie().isEmpty()){ 
      builder.addHeader("cookie", "user.getCookie()"); 
     } 
     response = client.newCall(builder.build()).execute(); 
     ResponseDataType responseDataType = new ResponseDataType(); 
     if(method.equals("DOWNLOAD")) { responseDataType.inputStream = response.body().byteStream(); } 
     else { 
      responseDataType.string = response.body().string(); 
      responseDataType.cookie = response.headers().get("set-cookie"); 
      CookieManager cManager = new CookieManager(null, CookiePolicy.ACCEPT_ALL); 
      cManager.getCookieStore().getCookies(); 
     } 
     return responseDataType; 

    } catch (IOException e) { 
     return null; 
    } 
} 

@Override 
protected void onPostExecute(ResponseDataType response) { 
    try { 
     if (method.equals("DOWNLOAD")) { 
      handler.onFinishCallback(response.inputStream); 
     }else { 
      handler.onFinishCallback(response.string, response.cookie); 
      CookieManager cManager = new CookieManager(null, CookiePolicy.ACCEPT_ALL); 
      cManager.getCookieStore().getCookies(); 
     } 
    }catch (Exception e){ 
     Log.d("hExceptionError", e.toString()); 
     handler.onFinishCallback("{\n" + 
       " \"error\": \"error\"\n" + 
       "}",""); 
    } 
} 

ich den Zugriffsfehler empfangen am wenn das Steuerelement versucht, die Realm-Ergebnisse auszuführen oder das erste Objekt aus Realm zu erhalten.

Unten ist mein RealmController, die ich in das Reich Instanz zu steuern geschaffen:

public class RealmController {`public static RealmController initialize(Activity activity) { 

    if (instance == null) { 
     instance = new RealmController(activity.getApplication()); 
    } 
    return instance; 
} 
public static RealmController initialize(MakeAsyncRequest activity) { 

    if (instance == null) { 
     instance = new RealmController(activity.); 
    } 
    return instance; 
} 
}` 

ich mein Benutzermodell (Realm-Objekt) mit Getter und Setter haben.

+0

Ihr Code ist unvollständig, posten Sie bitte eine MVCE –

+0

@TimCastelijns Darf ich wissen, was MVCE ist? Ich bin ein Anfänger zum Kodieren. –

+0

@ThillaiK MVCE ist Minimal, vollständige und überprüfbare Beispiel - http://Stackoverflow.com/help/mcve – jakubbialkowski

Antwort

0

Der Punkt ist - Sie können Realm nicht auf verschiedenen Threads erstellen und darauf zugreifen, d. H. Realm-Instanz in Aktivität erstellen und in der Methode .doInBackground() verwenden. Erstellen und veröffentlichen Sie Realm unmittelbar vor und nach der Transaktion. Es kann ein anderes Problem geben - nicht Querbeobachter auf Hintergrund Thread in AsyncTask registrieren - es hat Looper nicht initialisiert - verwenden Sie Haupt-Thread oder HandlerThread. Geben Sie Realm frei, nachdem es nicht mehr benötigt wird (Sie haben es nicht in Ihrem Code eingegeben), da Realm eine begrenzte Anzahl von Instanzen hat.