gpt4 book ai didi

android - 扩展 AsyncTask 时如何以及在何处调用我的任务

转载 作者:行者123 更新时间:2023-11-29 22:12:40 26 4
gpt4 key购买 nike

我很难理解 AsyncTask,即使在 Developer.Android 上阅读了有关它的所有内容之后也是如此。我正在寻找一些关于我应该如何进行的见解。情况是这样的:

我有一个 Activity,它在 onClick 事件上调用底层 LoginController 类的 LoginCheck() 方法。 LoginController 类然后继续从 UserInfo 类或 Activity(用户和密码)中获取任何必要的信息,并创建一个 RestClient 实例,然后调用 Web 服务并尝试登录。RestClient 有一个私有(private)的扩展 AsyncTask 的 CallServiceTask 类。

我这里有一些设计问题,希望您能提供帮助。

  • 我做得对吗?这是确保异步完成对 Web 服务的任何调用的正确方法吗?
  • 如何使用 onProgressUpdate 或其他方式通知用户应用程序正在登录?
  • 我将如何获取保存在 DoinBackground() 中的数据?

下面是相关项目的 fragment :

RestClient

// From the constructor...
rtnData = new Object[]{ new JSONObject() , Boolean.TRUE };

public void ExecuteCall(RequestMethod method) throws Exception
{
Object[] parameters = new Object[]{ new HttpGet() , new String("") };
switch(method) {
case GET:
{
//add parameters
String combinedParams = "";
if(!params.isEmpty()){
combinedParams += "?";
for(NameValuePair p : params)
{
String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue());
if(combinedParams.length() > 1)
{
combinedParams += "&" + paramString;
}
else
{
combinedParams += paramString;
}
}
}

HttpGet request = new HttpGet(url + combinedParams);

//add headers
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
parameters[0] = request;
parameters[1] = url;

new CallServiceTask().execute(request, url);


jsonData = ((JSONObject) rtnData[0]).optJSONObject("data");
connError = (Boolean) rtnData[1];
break;

}
case POST: ....

}
}

private Object[] executeRequest(HttpUriRequest request, String url)
{
HttpClient client = new DefaultHttpClient();
client = getNewHttpClient();

HttpResponse httpResponse;

try {
httpResponse = client.execute(request);
HttpEntity entity = httpResponse.getEntity();

if (entity != null) {

InputStream instream = entity.getContent();
String response = convertStreamToString(instream);
try {
rtnData[0] = new JSONObject(response);
rtnData[1] = false;

} catch (JSONException e1) {
rtnData[1] = true;
e1.printStackTrace();
}

// Closing the input stream will trigger connection release
instream.close();
}

} catch (ClientProtocolException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
} catch (IOException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
}
return rtnData;
}

调用服务任务

    private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{

protected Object[] doInBackground(Object... params)
{
HttpUriRequest req = (HttpUriRequest) params[0];
String url = (String) params[1];

return executeRequest(req, url);
}

@Override
protected void onPostExecute(Object[] result)
{
rtnData = result;
}
}

最佳答案

任何可能长时间运行的操作都应该在单独的线程中执行,这是绝对正确的。 AsyncTask 是解决此类问题的好方法,因为它还为您提供了一种将任务与 UI 线程同步的简单方法。这是您第一个问题的答案。

现在,关于 UI 线程更新以向您的用户表明您的应用程序没有卡住。由于 AsyncTaskonPreExecute()onPostExecute() 方法在 UI 线程内运行,您可以轻松地创建、运行和停止 ProgressDialogProgressBar 在那里。如果你想显示任务的当前进度,你应该在doInBackground()中调用publishProgress(int)方法,然后在中使用它>AsyncTaskonProgressUpdate() 方法。例如,您可以在那里更新您的 ProgressDialog

要从 AsyncTask 中获取结果,您可以调用它的 get() 方法(这是一个同步调用),或者实现某种回调接口(interface),告诉 Activity 该任务已经完成了。

我希望答案足够清楚,如果没有 - 请随时提出更多问题。希望这会有所帮助。

编辑

使用一个方法创建一个名为 onFetchFinishedListener 的接口(interface) - void onFetchFinished(String)。您启动 AsyncTask 的 Activity 必须实现此接口(interface)。现在在你的 AsyncTask 中创建一个构造函数,它将一个 OnFetchFinishedListener 对象作为参数,并在你的 Activity 中实例化 AsyncTask 时发送一个对Activity 作为参数(因为它实现了 OnFetchFinishedListener)。然后,当您的任务在 doInBackground() 中完成时,对 Activity 调用 onFetchFinished()。现在,在 ActivityonFetchFinished(String) 方法中,您可以使用回调带来的 String(或其他对象)。再次希望我说得足够清楚。

关于android - 扩展 AsyncTask 时如何以及在何处调用我的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9259552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com