2016-11-08 15 views
-1

以下のように私のアプリケーションにasyncTaskがあります。私は、このAsyncTaskにレルム(別のアクティビティに正常に格納されている)からデータをフェッチする必要があります。以下は私のAsyncTaskコードです: - 「間違ったスレッドからのレルムのアクセスレルムオブジェクトは彼らだけが作成されたスレッド上でアクセスすることができます。」私はアクセスエラーを受けていますAndroid、どのようにAsyncTaskで領域を開始するには?

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" + 
       "}",""); 
    } 
} 

コントロールがレルム結果を実行しようとするか、レルムから最初のオブジェクトを取得しようとするたびに実行されます。以下は

私はレルムインスタンスを制御するために作成された私のRealmControllerです:

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; 
} 
}` 

私はセッターとゲッターと私のユーザモデル(レルムオブジェクト)を持っています。

+0

コードが不完全で、MVCEを投稿してください –

+0

@TimCastelijns MVCEとは何ですか?私はコーディングの初心者です。 –

+0

@ThillaiK MVCEは、最小限の完全かつ検証可能な例です - http://stackoverflow.com/help/mcve – jakubbialkowski

答えて

0

ポイントは - 異なるスレッドでRealmを作成してアクセスすることはできません。つまり、アクティビティでRealmインスタンスを作成し、.doInBackground()メソッドで使用することはできません。トランザクションの直前および直後にレルムを作成および解放します。 別の問題があるかもしれません - AsyncTaskのバックグラウンドスレッドにquer observerを登録しないでください - それはLooperが初期化されていません - メインスレッドまたはHandlerThreadを使用します。 Realmにはインスタンスの数が限られているため、不要になった後はレルムを解放します(コードには含まれていません)。

関連する問題