রেস্টল এপিআই পরিষেবা


226

আমি একটি পরিষেবা তৈরি করতে চাই যা আমি একটি ওয়েব-ভিত্তিক REST এপিআইতে কল করতে ব্যবহার করতে পারি।

মূলত আমি অ্যাপ টিপিতে কোনও পরিষেবা শুরু করতে চাই তারপরে আমি সেই পরিষেবাটি ইউআরএল অনুরোধ করতে এবং ফলাফলগুলি ফিরে আসতে বলতে চাই। ইতিমধ্যে আমি একটি অগ্রগতি উইন্ডো বা অনুরূপ কিছু প্রদর্শন করতে সক্ষম হতে চাই।

আমি বর্তমানে একটি পরিষেবা তৈরি করেছি যা আইডিএল ব্যবহার করে, আমি কোথাও পড়েছি যে ক্রস অ্যাপ যোগাযোগের জন্য আপনার কেবল সত্যিকারের এটি প্রয়োজন, সুতরাং মনে করুন যে এই প্রয়োজনীয়তাগুলি কেটে ফেলা হচ্ছে তবে কীভাবে কলব্যাক করবেন তা নিশ্চিত না। এছাড়াও আমি যখন post(Config.getURL("login"), values)অ্যাপ্লিকেশনটিতে আঘাত করি তখন মনে হয় কিছুক্ষণ বিরতি দেওয়া হয়েছে (অদ্ভুত বলে মনে হচ্ছে - কোনও পরিষেবার পিছনে ধারণাটি ছিল যে এটি অন্য থ্রেডে চলে!)

বর্তমানে আমার পোস্টের সাথে একটি পরিষেবা রয়েছে এবং আমি এইচডিপি পদ্ধতিগুলির ভিতরেই পেয়েছি, বেশ কয়েকটি এইআইডিএল ফাইল (দ্বিপথ যোগাযোগের জন্য), একটি সার্ভিস ম্যানেজার যা পরিষেবাটি শুরু করা, থামানো, বাঁধাই ইত্যাদির সাথে সম্পর্কিত এবং আমি গতিশীলভাবে নির্দিষ্ট কোড সহ একটি হ্যান্ডলার তৈরি করছি কলব্যাকের জন্য প্রয়োজন হিসাবে

আমি চাই না যে কেউ আমাকে কাজ করার জন্য একটি সম্পূর্ণ কোড বেস দেয়, তবে কিছু পয়েন্টার প্রচুর প্রশংসা করবে।

কোড (বেশিরভাগ) পূর্ণ:

public class RestfulAPIService extends Service  {

final RemoteCallbackList<IRemoteServiceCallback> mCallbacks = new RemoteCallbackList<IRemoteServiceCallback>();

public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
}
public IBinder onBind(Intent intent) {
    return binder;
}
public void onCreate() {
    super.onCreate();
}
public void onDestroy() {
    super.onDestroy();
    mCallbacks.kill();
}
private final IRestfulService.Stub binder = new IRestfulService.Stub() {
    public void doLogin(String username, String password) {

        Message msg = new Message();
        Bundle data = new Bundle();
        HashMap<String, String> values = new HashMap<String, String>();
        values.put("username", username);
        values.put("password", password);
        String result = post(Config.getURL("login"), values);
        data.putString("response", result);
        msg.setData(data);
        msg.what = Config.ACTION_LOGIN;
        mHandler.sendMessage(msg);
    }

    public void registerCallback(IRemoteServiceCallback cb) {
        if (cb != null)
            mCallbacks.register(cb);
    }
};

private final Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {

        // Broadcast to all clients the new value.
        final int N = mCallbacks.beginBroadcast();
        for (int i = 0; i < N; i++) {
            try {
                switch (msg.what) {
                case Config.ACTION_LOGIN:
                    mCallbacks.getBroadcastItem(i).userLogIn( msg.getData().getString("response"));
                    break;
                default:
                    super.handleMessage(msg);
                    return;

                }
            } catch (RemoteException e) {
            }
        }
        mCallbacks.finishBroadcast();
    }
    public String post(String url, HashMap<String, String> namePairs) {...}
    public String get(String url) {...}
};

দু'এইডএল ফাইল:

package com.something.android

oneway interface IRemoteServiceCallback {
    void userLogIn(String result);
}

এবং

package com.something.android
import com.something.android.IRemoteServiceCallback;

interface IRestfulService {
    void doLogin(in String username, in String password);
    void registerCallback(IRemoteServiceCallback cb);
}

এবং পরিষেবা পরিচালক:

public class ServiceManager {

    final RemoteCallbackList<IRemoteServiceCallback> mCallbacks = new RemoteCallbackList<IRemoteServiceCallback>();
    public IRestfulService restfulService;
    private RestfulServiceConnection conn;
    private boolean started = false;
    private Context context;

    public ServiceManager(Context context) {
        this.context = context;
    }

    public void startService() {
        if (started) {
            Toast.makeText(context, "Service already started", Toast.LENGTH_SHORT).show();
        } else {
            Intent i = new Intent();
            i.setClassName("com.something.android", "com.something.android.RestfulAPIService");
            context.startService(i);
            started = true;
        }
    }

    public void stopService() {
        if (!started) {
            Toast.makeText(context, "Service not yet started", Toast.LENGTH_SHORT).show();
        } else {
            Intent i = new Intent();
            i.setClassName("com.something.android", "com.something.android.RestfulAPIService");
            context.stopService(i);
            started = false;
        }
    }

    public void bindService() {
        if (conn == null) {
            conn = new RestfulServiceConnection();
            Intent i = new Intent();
            i.setClassName("com.something.android", "com.something.android.RestfulAPIService");
            context.bindService(i, conn, Context.BIND_AUTO_CREATE);
        } else {
            Toast.makeText(context, "Cannot bind - service already bound", Toast.LENGTH_SHORT).show();
        }
    }

    protected void destroy() {
        releaseService();
    }

    private void releaseService() {
        if (conn != null) {
            context.unbindService(conn);
            conn = null;
            Log.d(LOG_TAG, "unbindService()");
        } else {
            Toast.makeText(context, "Cannot unbind - service not bound", Toast.LENGTH_SHORT).show();
        }
    }

    class RestfulServiceConnection implements ServiceConnection {
        public void onServiceConnected(ComponentName className, IBinder boundService) {
            restfulService = IRestfulService.Stub.asInterface((IBinder) boundService);
            try {
            restfulService.registerCallback(mCallback);
            } catch (RemoteException e) {}
        }

        public void onServiceDisconnected(ComponentName className) {
            restfulService = null;
        }
    };

    private IRemoteServiceCallback mCallback = new IRemoteServiceCallback.Stub() {
        public void userLogIn(String result) throws RemoteException {
            mHandler.sendMessage(mHandler.obtainMessage(Config.ACTION_LOGIN, result));

        }
    };

    private Handler mHandler;

    public void setHandler(Handler handler) {
        mHandler = handler;
    }
}

পরিষেবা আরম্ভ এবং বাঁধাই:

// this I'm calling on app onCreate
servicemanager = new ServiceManager(this);
servicemanager.startService();
servicemanager.bindService();
application = (ApplicationState)this.getApplication();
application.setServiceManager(servicemanager);

পরিষেবা ফাংশন কল:

// this lot i'm calling as required - in this example for login
progressDialog = new ProgressDialog(Login.this);
progressDialog.setMessage("Logging you in...");
progressDialog.show();

application = (ApplicationState) getApplication();
servicemanager = application.getServiceManager();
servicemanager.setHandler(mHandler);

try {
    servicemanager.restfulService.doLogin(args[0], args[1]);
} catch (RemoteException e) {
    e.printStackTrace();
}

...later in the same file...

Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {

        switch (msg.what) {
        case Config.ACTION_LOGIN:

            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
            }

            try {
                ...process login results...
                }
            } catch (JSONException e) {
                Log.e("JSON", "There was an error parsing the JSON", e);
            }
            break;
        default:
            super.handleMessage(msg);
        }

    }

};

5
এটি Android REST ক্লায়েন্ট বাস্তবায়ন শেখার লোকদের পক্ষে খুব সহায়ক হতে পারে। ডবজানসির উপস্থাপনাটি পিডিএফ
কে জেড

যেহেতু অনেক লোক ভার্জিল ডবজানসির উপস্থাপনা এবং আইও ২০১০-এর লিঙ্কটি এখনই নষ্ট হয়ে গেছে, তাই এখানে YT ভিডিওর সরাসরি লিঙ্কটি দেওয়া হয়েছে: youtube.com/watch?v=xHXn3Kg2IQE
জোসে_জিডি

উত্তর:


283

যদি আপনার পরিষেবা আপনার আবেদনের অংশ হতে চলেছে তবে আপনি এটির প্রয়োজনের চেয়ে আরও জটিল করে তুলছেন। যেহেতু আপনার কাছে একটি রেস্টস্টুল ওয়েব সার্ভিস থেকে কিছু ডেটা পাওয়ার সহজ ব্যবহার রয়েছে তাই আপনার রেজাল্ট রিসিভার এবং ইনটেন্ট সার্ভিসের দিকে নজর দেওয়া উচিত ।

আপনি যখন কোন পদক্ষেপ নিতে চান তখন এই পরিষেবা + ফলাফল ফলাফলের প্যাটার্নটি স্টার্ট সার্ভিস () দিয়ে পরিষেবাটি শুরু বা বাঁধাইয়ের মাধ্যমে কাজ করে । আপনি নিজের রেজাল্ট রিসিভারে (ক্রিয়াকলাপ) ইনটেন্টের অতিরিক্তগুলির মাধ্যমে সঞ্চালন করতে এবং পাস করার জন্য অপারেশন নির্দিষ্ট করতে পারেন।

পরিষেবাটিতে আপনি হ্যান্ডলিআইন্টেন্টকে ইন্টেন্টে নির্দিষ্ট করা অপারেশনটি করতে প্রয়োগ করেন। যখন অপারেশন সম্পন্ন হয় আপনি ResultReceiver পাস ব্যবহার করতে পাঠান ভ্রমণ যা বিন্দু একটি বার্তা ফিরে onReceiveResult ডাকা হবে।

সুতরাং উদাহরণস্বরূপ, আপনি আপনার ওয়েব পরিষেবা থেকে কিছু ডেটা টানতে চান।

  1. আপনি অভিপ্রায় তৈরি করেন এবং স্টার্ট সার্ভিস কল করেন।
  2. পরিষেবাটিতে অপারেশন শুরু হয় এবং এটি ক্রিয়াকলাপটি একটি বার্তা প্রেরণ করে বলে যে এটি শুরু হয়েছে started
  3. ক্রিয়াকলাপ বার্তাটি প্রসেস করে এবং একটি অগ্রগতি দেখায়।
  4. পরিষেবাটি ক্রিয়াকলাপ শেষ করে এবং আপনার ক্রিয়াকলাপে কিছু ডেটা প্রেরণ করে।
  5. আপনার ক্রিয়াকলাপ ডেটা প্রসেস করে এবং একটি তালিকার দৃশ্যে রাখে
  6. পরিষেবাটি আপনাকে একটি বার্তা প্রেরণ করে বলে যে এটি হয়ে গেছে, এবং এটি নিজেই মারা যায়।
  7. ক্রিয়াকলাপটি সমাপ্তি বার্তা পায় এবং অগ্রগতি ডায়ালগটি আড়াল করে।

আমি জানি আপনি উল্লেখ করেছেন যে আপনি কোনও কোড বেস চান না তবে ওপেন সোর্স গুগল আই / ও ২০১০ অ্যাপটি একটি পরিষেবা ব্যবহার করে যা আমি বর্ণনা করছি।

নমুনা কোড যুক্ত করতে আপডেট হয়েছে:

কার্যক্রম.

public class HomeActivity extends Activity implements MyResultReceiver.Receiver {

    public MyResultReceiver mReceiver;

    public void onCreate(Bundle savedInstanceState) {
        mReceiver = new MyResultReceiver(new Handler());
        mReceiver.setReceiver(this);
        ...
        final Intent intent = new Intent(Intent.ACTION_SYNC, null, this, QueryService.class);
        intent.putExtra("receiver", mReceiver);
        intent.putExtra("command", "query");
        startService(intent);
    }

    public void onPause() {
        mReceiver.setReceiver(null); // clear receiver so no leaks.
    }

    public void onReceiveResult(int resultCode, Bundle resultData) {
        switch (resultCode) {
        case RUNNING:
            //show progress
            break;
        case FINISHED:
            List results = resultData.getParcelableList("results");
            // do something interesting
            // hide progress
            break;
        case ERROR:
            // handle the error;
            break;
    }
}

সেবা:

public class QueryService extends IntentService {
    protected void onHandleIntent(Intent intent) {
        final ResultReceiver receiver = intent.getParcelableExtra("receiver");
        String command = intent.getStringExtra("command");
        Bundle b = new Bundle();
        if(command.equals("query") {
            receiver.send(STATUS_RUNNING, Bundle.EMPTY);
            try {
                // get some data or something           
                b.putParcelableArrayList("results", results);
                receiver.send(STATUS_FINISHED, b)
            } catch(Exception e) {
                b.putString(Intent.EXTRA_TEXT, e.toString());
                receiver.send(STATUS_ERROR, b);
            }    
        }
    }
}

রেজাল্ট রিসিভার এক্সটেনশান - মাইআরসাল্টসিভার বাস্তবায়ন সম্পর্কে সম্পাদিত। রিসিভার

public class MyResultReceiver implements ResultReceiver {
    private Receiver mReceiver;

    public MyResultReceiver(Handler handler) {
        super(handler);
    }

    public void setReceiver(Receiver receiver) {
        mReceiver = receiver;
    }

    public interface Receiver {
        public void onReceiveResult(int resultCode, Bundle resultData);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (mReceiver != null) {
            mReceiver.onReceiveResult(resultCode, resultData);
        }
    }
}

1
চমৎকার আপনাকে ধন্যবাদ! আমি গুগল আইওএসড অ্যাপ্লিকেশন এবং বাহের মধ্য দিয়ে গিয়ে শেষ করেছি ... এটি বেশ জটিল তবে আমার এমন কিছু আছে যা কাজ করছে, এখন আমার কেবল এটি কেন কাজ করে তা প্রকাশ করা দরকার! তবে হ্যাঁ, এটি আমার কাজ করছে এমন বেসিক প্যাটার্ন। আপনাকে অনেক ধন্যবাদ.
মার্টিন

29
উত্তরে একটি ছোট সংযোজন: আপনি যেমন এমআরসিভার.সেটরসিভার করেন (নাল); অনপেজ পদ্ধতিতে আপনার mReceiver.setReceiver (এটি) করা উচিত; onResume পদ্ধতিতে। অন্যথায় যদি আপনার ক্রিয়াকলাপটি পুনরায় তৈরি না করে পুনরায় শুরু করা হয় তবে আপনি ইভেন্টগুলি নাও পেতে পারেন
ভিনসেন্ট মিমাউন-প্রট

7
দস্তাবেজগুলি কি বলে না যে আপনাকে স্টপসেল্ফ কল করতে হবে না, যেহেতু ইনটেন্স সার্ভিস আপনার জন্য এটি করে?
মিকেল ওহলসন

2
@ মিকায়েল ওহলসন সঠিক, আপনি সাবক্লাস করলে কল করা উচিত নয় কারণ আপনি যদি এটি করেন তবে আপনি যে কোনও মুলতুবি অনুরোধ হারিয়ে ফেলবেন । stopSelfIntentServiceIntentService
নীরবতা

1
IntentServiceকাজ সম্পূর্ণ হলে নিজেকে হত্যা করবে, তাই this.stopSelf()অপ্রয়োজনীয়।
ইউপোরি

17

অ্যান্ড্রয়েড আরইএসটি ক্লায়েন্ট অ্যাপ্লিকেশনগুলি বিকাশ করা আমার কাছে দুর্দান্ত একটি সংস্থান হয়ে দাঁড়িয়েছে। স্পিকার কোনও কোড দেখায় না, তিনি কেবল অ্যান্ড্রয়েডে রক সলিড রেস্ট এপিকে একসাথে রাখার নকশা বিবেচনা এবং কৌশলগুলি নিয়ে যান। যদি আপনার কোনও পডকাস্ট কিন্ডা ব্যক্তি বা না হন তবে আমি এটিকে কমপক্ষে একটি শোনার পরামর্শ দিচ্ছি তবে ব্যক্তিগতভাবে আমি এটিকে এতদূর 4 বা পাঁচ বার শুনেছি এবং আমি সম্ভবত এটি আবার শুনতে যাচ্ছি।

Android REST ক্লায়েন্ট অ্যাপ্লিকেশনগুলি বিকাশ করছে
লেখক: ভার্জিল ডবজানশি
বর্ণনা:

এই অধিবেশনটি অ্যান্ড্রয়েড প্ল্যাটফর্মে RESTful অ্যাপ্লিকেশনগুলি বিকাশের জন্য স্থাপত্য সংক্রান্ত বিবেচনাগুলি উপস্থাপন করবে। এটি নকশার ধরণগুলি, প্ল্যাটফর্মের সংহতকরণ এবং অ্যান্ড্রয়েড প্ল্যাটফর্মের জন্য নির্দিষ্ট পারফরম্যান্স সম্পর্কিত বিষয়ের উপর দৃষ্টি নিবদ্ধ করে।

এবং এমন অনেকগুলি বিবেচনা রয়েছে যা আমি আমার এপিআইয়ের প্রথম সংস্করণে সত্যই তৈরি করতে পারি নি যা আমাকে রিফ্যাক্টর করতে হয়েছিল


4
+1 এর মধ্যে এমন ধরণের বিবেচনা রয়েছে যা আপনি কখন শুরু করবেন তা ভাববেন না।
থমাস আহলে

হ্যাঁ, রেস্ট ক্লায়েন্ট তৈরির ক্ষেত্রে আমার প্রথম প্রচলনটি হুবহু ঠিক কী করবেন না তার তার বর্ণনাটি ছিল (ধন্যবাদ আমি এটি দেখার আগে বুঝতে পেরেছিলাম যে এটির অনেক কিছুই ভুল ছিল)। আমি কিছুটা লম্বা।
টেরেন্স

আমি এই ভিডিওটি একাধিকবার দেখেছি এবং আমি দ্বিতীয় প্যাটার্নটি বাস্তবায়ন করছি। আমার সমস্যাটি হ'ল সার্ভার থেকে আসা তাজা ডেটা থেকে স্থানীয় ডেটা আপডেট করার জন্য আমার জটিল ডাটাবেস মডেলে লেনদেনগুলি ব্যবহার করা দরকার এবং কন্টেন্টপ্রাইডার ইন্টারফেস আমাকে এটি করার কোনও উপায় সরবরাহ করে না। আপনার কি কোনও পরামর্শ আছে, টেরেন্স?
ফ্লাভিও ফারিয়া

2
এনবি: এইচটিপিপ্লেইয়েন্টে দবজানসির মন্তব্যগুলি এখন আর ধরে না। স্ট্যাকওভারফ্লো.com
ডোনাল লাফার্টি

হ্যাঁ, এইচটিটিপিআরএল সংযোগ এখন পছন্দসই। তদ্ব্যতীত, অ্যান্ড্রয়েড .0.০ প্রকাশের সাথে সাথে অ্যাপাচি এইচটিটিপি ক্লায়েন্টের সমর্থন সরানো হয়েছে
রনআর

16

এছাড়াও যখন আমি পোস্টটি (কনফিগারেশন.এল URL ("লগইন"), মানগুলি) হিট করি তখন অ্যাপটি কিছুক্ষণের জন্য বিরতি দেয় বলে মনে হয় (অদ্ভুত বলে মনে হয় - কোনও পরিষেবার পিছনে ধারণাটি ছিল যে এটি কোনও ভিন্ন থ্রেডে চলে!)

আপনার নিজের কোনও থ্রেড তৈরি করতে হবে না , একটি স্থানীয় পরিষেবা ডিফল্টরূপে ইউআই থ্রেডে চলে।


11

আমি জানি @ মার্টিন পুরো কোড চায় না, তবে আমি মনে করি যে এই মন্তব্যটি এই প্রশ্নের পক্ষে এটি ভাল:

10 টি ওপেন সোর্স অ্যান্ড্রয়েড অ্যাপ্লিকেশন যা প্রতিটি অ্যান্ড্রয়েড বিকাশকারীকে অবশ্যই সন্ধান করা উচিত

অ্যান্ড্রয়েডের জন্য চৌবাচ্চা মুক্ত-উত্স , এবং চৌকসই আরএসটি এপিআইয়ের সাথে ইন্টারঅ্যাক্ট করার একটি আকর্ষণীয় কোড প্যাটার্ন রয়েছে।


6

আমি অত্যন্ত REST ক্লায়েন্ট retrofit সুপারিশ করব ।

আমি এই ভাল লিখিত ব্লগ পোস্ট অত্যন্ত সহায়ক পেয়েছি, এটি সহজ উদাহরণ কোড রয়েছে। ডেটা বাসের প্যাটার্নটি প্রয়োগ করতে লেখক নেটওয়ার্ক কল এবং অটো করার জন্য রেট্রোফিট ব্যবহার করেন :

http://www.mdswanson.com/blog/2014/04/07/durable-android-rest-clients.html


5

কেবলমাত্র আপনারা সবাইকে নির্দেশ করতে চেয়েছিলেন যে আমি স্ট্যান্ডেলোন ক্লাসের দিকে রোল করেছি যা কার্যকরীতার সমস্তটি অন্তর্ভুক্ত করে।

http://github.com/StlTenny/RestService

এটি অনুরোধটি অ-অবরুদ্ধকরণ হিসাবে কার্যকর করে এবং হ্যান্ডলারটি কার্যকর করার জন্য সহজে ফলাফলগুলিকে দেয়। এমনকি একটি উদাহরণ বাস্তবায়ন সঙ্গে আসে।


4

বলুন আমি একটি ইভেন্টে পরিষেবাটি শুরু করতে চাই - একটি বোতামের অন আইটেম ক্লিক ()। রিসিভার মেকানিজম সে ক্ষেত্রে কাজ করবে না কারণ: -
ক) আমি রিসিভারটি (আইটেমিক্লিকড ()
খ) এর ক্রিয়াকলাপ ব্যাকগ্রাউন্ডে চলে আসে সেবার (ইনটেন্ট অতিরিক্ত হিসাবে) পরিষেবাতে পাস করেছি । অনপজ () -তে আমি ক্রিয়াকলাপ ফাঁস এড়াতে নিখরচায় ফলাফলের রিসিভারের রেফারেন্স সেট করেছিলাম।
গ) ক্রিয়াকলাপ নষ্ট হয়ে যায়।
d) ক্রিয়াকলাপ আবার তৈরি হয়। তবে এই মুহুর্তে পরিষেবাটি রিসিভারের রেফারেন্স হারিয়ে যাওয়ার কারণে ক্রিয়াকলাপে কলব্যাক করতে সক্ষম হবে না।
সীমাবদ্ধ সম্প্রচারের একটি প্রক্রিয়া বা একটি মুলতুবি থাকা সম্পর্কিত পরিস্থিতি এই জাতীয় পরিস্থিতিতে আরও দরকারী বলে মনে হচ্ছে - পরিষেবা থেকে কার্যকলাপের জন্য বিজ্ঞপ্তিটি উল্লেখ করুন


1
আপনি যা বলছেন তাতে সমস্যা আছে। এটি হ'ল যখন কার্যকলাপটি পটভূমিতে চলে যায় তখন তা ধ্বংস হয় না ... তাই রিসিভারটি এখনও বিদ্যমান এবং ক্রিয়াকলাপের প্রসঙ্গটিও।
DArkO

@ ডারকো যখন কোনও ক্রিয়াকলাপ বিরতি দেওয়া হয় বা থামানো হয় তখন এন্ড্রয়েড সিস্টেম কম স্মৃতি পরিস্থিতিতে মেরে ফেলতে পারে। পড়ুন ভ্রমণ লাইফ সাইকল
jk7

4

দ্রষ্টব্য যে রবি পন্ডের সমাধানটি কোনওভাবেই অভাবের সাথে রয়েছে: এইভাবে আপনি কেবলমাত্র একবারে একটি এপি কল করতে পারবেন যেহেতু ইনটেন্ট সার্ভিসেস একবারে কেবল একটি উদ্দেশ্যকে পরিচালনা করে। প্রায়শই আপনি সমান্তরাল এপি কলগুলি করতে চান। আপনি যদি এটি করতে চান তবে আপনাকে ইনটেন্ট সার্ভিসের পরিবর্তে পরিষেবাটি প্রসারিত করতে হবে এবং আপনার নিজস্ব থ্রেড তৈরি করতে হবে।


1
আপনি এখনও ইন্টেন্ট সার্ভিসে একাধিক কল করতে পারেন ওয়েব সার্ভিস এপিআই কল একটি নির্বাহী-থ্রেড-পরিষেবাতে অর্পণ করে, আপনার ইনটেন্ট সার্ভিস-প্রাপ্ত শ্রেণীর সদস্য ভেরিয়েবল হিসাবে উপস্থিত
ভাইরেন

2

এছাড়াও যখন আমি পোস্টটি (কনফিগারেশন.এল URL ("লগইন"), মানগুলি) হিট করি তখন অ্যাপটি কিছুক্ষণের জন্য বিরতি দেয় বলে মনে হয় (অদ্ভুত বলে মনে হয় - কোনও পরিষেবার পিছনে ধারণাটি ছিল যে এটি কোনও ভিন্ন থ্রেডে চলে!)

এক্ষেত্রে অ্যাসিনটাস্ক ব্যবহার করা আরও ভাল যা ভিন্ন থ্রেডে চলে এবং সমাপ্তির পরে ইউআই থ্রেডে ফিরে আসে।


2

এখানে আরও একটি পদ্ধতি রয়েছে যা মূলত আপনাকে অনুরোধগুলির পুরো পরিচালনা সম্পর্কে ভুলে যেতে সহায়তা করে। এটি একটি অ্যাসিঙ্ক সারি পদ্ধতি এবং কলযোগ্য / কলব্যাক ভিত্তিক প্রতিক্রিয়ার উপর ভিত্তি করে। প্রধান সুবিধাটি হ'ল এই পদ্ধতিটি ব্যবহার করে আপনি সম্পূর্ণ প্রক্রিয়াটি আপনার পক্ষে সম্পূর্ণ স্বচ্ছ করতে পারবেন (অনুরোধ করুন, পেয়ে যাবেন এবং সাড়া দিতে পারবেন) completely আপনি একবার প্রতিক্রিয়া কোড পেলে কাজটি ইতিমধ্যে হয়ে গেছে। এর পরে আপনাকে কেবল আপনার ডিবিতে কল করতে হবে এবং আপনার কাজ শেষ হয়েছে। এটি আপনার ক্রিয়াকলাপটি সক্রিয় না হলে কী ঘটে তা সমস্যাযুক্ত হিসাবে সহায়তা করে। এখানে যা ঘটবে তা হ'ল আপনার স্থানীয় ডেটাবেজে আপনার সমস্ত ডেটা সংরক্ষণ করা হবে তবে প্রতিক্রিয়াটি আপনার ক্রিয়াকলাপ দ্বারা প্রসেস করা হবে না, এটি আদর্শ উপায়।

আমি এখানে একটি সাধারণ পদ্ধতির বিষয়ে লিখেছি http://ugiagonzalez.com/2012/07/02/theres- Life- after-asynctasks-in-android/

আমি আসন্ন পোস্টগুলিতে নির্দিষ্ট নমুনা কোড লাগাব। আশা করি এটি সহায়তা করে, সম্ভাব্য সন্দেহ বা সমস্যা সমাধানের জন্য যোগাযোগের জন্য বিনা দ্বিধায় আমার সাথে যোগাযোগ করুন।


মৃত লিঙ্ক। ডোমেনটির মেয়াদ শেষ হয়ে গেছে।
jk7

1

রবি একটি দুর্দান্ত উত্তর সরবরাহ করে, যদিও আমি আপনাকে এখনও আরও তথ্যের সন্ধান করতে দেখতে পাচ্ছি। আমি REST এপিআই বাস্তবায়িত করেছি সহজ BUT ভুল উপায়। এই গুগল আই / ও ভিডিও দেখার আগেই আমি বুঝতে পারি না যে আমি কোথায় ভুল করেছি। এটি কোনও HtpUrlConnication get / put কলের সাথে AsyncTask একসাথে রাখার মতো সহজ নয়।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.