我有一個外部庫可以通過互聯網與服務器通信。每次我需要從互聯網上獲取一些信息時,android都會迫使我使用asynctask。到目前爲止沒有問題。然而,我從越來越多的任務中檢索(以不同的方式)來自互聯網的數據,並且我不喜歡每次呼叫增加不同的類。 長話短說:我有不同的網絡電話,而不是爲每個電話創建一個asynctask-class,我會優先選擇一個班級來管理所有不同的電話。這是否有可能?更重要的是,這樣做的正確方法是什麼?如何管理需要由AsyncTask調用的不同任務
4
A
回答
1
像你have.But我通過反射技術解決了這個問題,我也面臨similer問題。我已經制定了一個方法來防止增加不同的類來調用單擊。 我做了單一的asynctask類,並通過onPostExecute傳遞了活動的函數名和上下文並返回了響應。
下面是示例 -
AsyncTaskConnection.java
public class AsyncTaskConnection extends AsyncTask<String, String, Object>{
JSONObject mainObject;
Context mContext;
String returnFunctionName;
public AsyncTaskConnection (Context context){
mContext = context;
}
protected void onPreExecute() {
// preExecute
}
@Override
protected Object doInBackground(String... arguments) {
String apiFunctionName = arguments[0]; // get api FunctionName
String jsonString = arguments[1]; // get data
returnFunctionName = apiFunctionName+"Response"; // return function name
// some connection code...
//then call...
try {
ht.call(NAMESPACE, requestEnvelop);
} catch (IOException ex) {
Log.d(mContext.getClass().getName(), "Io exception bufferedIOStream closed" + ex);
ex.printStackTrace();
}
return mainObject.toString();
} catch (Exception e) {
Log.d("Exception", e.toString());
return "no";
}
}
// main thing is there, i have use the reflaction here....
@Override
protected void onPostExecute(Object backresult) {
Method m;
try {
m = mContext.getClass().getDeclaredMethod(returnFunctionName, String.class);
m.invoke(mContext, (String) backresult);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
在主叫類
//call this class where you want and get dynamic response
new AsyncTaskConnection(this).execute("getHomepage",jo.toString());
// and make response fuction
protected void getHomepageResponse(String backresult) {
try {
// this is your response
mainObject = new JSONObject(backresult);
} catch (JSONException e) {
e.printStackTrace();
}
}
並且可以有多種途徑獲得結果是你想要的。
1
是的,這是可能的,但你需要創建一些通用的AsyncTask,接收結果時需要API(url調用)和處理程序。
異步類:
public class AsyncTaskThread extends AsyncTask<Object, Object, Object> {
//instance variables
Handler myHandler;
public AsyncTaskThread(String uriString, Handler myHandler) {
//set these arguments to respective instance variables
this.myHandler=myHandler;
}
protected Object doInBackground(Object... obj){
//business logic
}
//----implement other methods of Async as per your requirement
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
Message message = new Message();
message.obj = result;
myHandler.sendMessage(message);
}
}
螺紋通處理器:
您需要通過處理器上面異步任務的說法。
new AsyncTaskThread(uri,new MyHandler())
import android.os.Handler;
private class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Model response = (Model) msg.obj;
}
}
當結果收到來自異步任務的傳遞處理程序調用sendMessage()方法。
我的建議:
如果您正在使用okhttp的API調用客戶端庫,請參閱https://github.com/square/okhttp/wiki/Recipes
相關問題
- 1. 如何管理AsyncTask和對話需要
- 2. 如何處理任務完成 - 但每個任務需要不同的方法來處理任務的結果
- 3. 任務管理器不同意Process Explorer?
- 4. 不要管理由註釋
- 5. TBB需要condition_variable用於任務同步
- 6. 需要本地管理員權限的.NET編程任務
- 7. 如何確定調用函數是否需要管理權限
- 8. 當我不需要存儲秒時,不使用SMALLDATETIME的任何好理由?
- 9. 需要說明:如何使用AsyncTask?
- 10. 如何在AsyncTask任務中調用Facebook的executeAndWait()
- 11. 如何管理芹菜中的任務?
- 12. 如何管理iPhone中的多任務
- 13. 如何使用任務並行庫管理任務列表
- 14. 從AsyncTask調用不同的回調onPostExecute()
- 15. 如何使用AsyncTask處理同一類中的Web服務的不同方法調用?
- 16. 即使任務由AsyncTask處理,主UI也會凍結
- 17. 如何管理同步任務中的線程數
- 18. 如何不同的任務
- 19. 如何調用不同用戶的隊列管理器連接?
- 20. MYSQL管理任務
- 21. RTOS任務管理
- 22. 理由Android的進程得到當任務管理器顯示
- 23. 任何理由在外部調用Backbone.View.render?
- 24. 如何解釋Windows任務管理器?
- 25. 如何防止我的應用程序由任務管理器結束進程?
- 26. 我該如何讓任務管理器不要殺我的程序?
- 27. 如何使用不同的URL調用異步任務
- 28. 不要調用外部JavaScript任務的Grunt任務
- 29. 如何管理處理任務中的服務質量?
- 30. Azure的AD管理員同意在需要時它不
Android不會強制您使用AsyncTasks - 有很多方法可以調用Web服務。也許類似Retrofit會有所幫助:https://github.com/square/retrofit – Intrications