Web 呼び出しが行われている間、バックグラウンドで Android のアニメーションを実行するには、AsyncTask を使用します。このように見えます
private class WebCallOperation extends AsyncTask<String, Void, String>
{
private final ProgressDialog dialog = new ProgressDialog(context);
@Override
protected String doInBackground(String... params)
{
//web call code here
//response returned here
return "";
}
@SuppressWarnings("rawtypes")
@Override
protected void onPostExecute(String result)
{
if (this.dialog.isShowing())
{
this.dialog.dismiss();
}
}
@Override
protected void onPreExecute()
{
this.dialog.setMessage("Loading");
this.dialog.show();
}
}
先ほど示したコード例では、ProgressDialog を追加しました。これは通常、Web 呼び出しを行うときに使用するものですが、必要なものに置き換えることができます。独自のビューを追加して、代わりにアニメーション化できます。実行前メソッドでアニメーション化してから、実行後メソッドで Web 呼び出しを終了します。
IOS アプリに関するちょっとしたアドバイス、私はすでにコメントで期間の問題について述べました。また、Web 呼び出しを実行するためのブロック コードを調査する必要があると思います。サンプルコードを提供したい場合は、生活がずっと楽になります
編集:
Objective-C ブロック コード。ここでこのクラスを作成します
インターフェイス クラス
#import <Foundation/Foundation.h>
#import "WebCall.h"
@interface WebCall : NSObject
{
void(^webCallDidFinish)(NSString *response);
}
@property (nonatomic, retain) NSMutableData *responseData;
-(void)setWebCallDidFinish:(void (^)(NSString *))wcdf;
-(void)webServiceCall :(NSString *)sURL_p : (NSMutableArray *)valueList_p : (NSMutableArray *)keyList_p;
@end
実装クラス
#import "WebCall.h"
#import "AppDelegate.h"
@implementation WebCall
@synthesize responseData;
-(void)setWebCallDidFinish:(void (^)(NSString *))wcdf
{
webCallDidFinish = [wcdf copy];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
int responseStatusCode = [httpResponse statusCode];
NSLog(@"Response Code = %i", responseStatusCode);
if(responseStatusCode < 200 || responseStatusCode > 300)
{
webCallDidFinish(@"failure");
}
[responseData setLength:0];
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"WebCall Error: %@", error);
webCallDidFinish(@"failure");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
response = [response stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
webCallDidFinish(response);
}
-(void)webServiceCall :(NSString *)sURL_p : (NSMutableArray *)valueList_p : (NSMutableArray *)keyList_p
{
NSMutableString *sPost = [[NSMutableString alloc] init];
//If any variables need passed in - append them to the POST
//E.g. if keyList object is username and valueList object is adam will append like
//http://test.jsp?username=adam
if([valueList_p count] > 0)
{
for(int i = 0; i < [valueList_p count]; i++)
{
if(i == 0)
{
[sPost appendFormat:@"%@=%@", [valueList_p objectAtIndex:i],[keyList_p objectAtIndex:i]];
}
else
{
[sPost appendFormat:@"&%@=%@", [valueList_p objectAtIndex:i], [keyList_p objectAtIndex:i]];
}
}
}
NSData * postData = [sPost dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
NSString * postLength = [NSString stringWithFormat:@"%d",[postData length]];
NSURL * url = [NSURL URLWithString:sURL_p];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
if (theConnection)
{
self.responseData = [NSMutableData data];
}
}
@end
次に、この Web 呼び出しを行うには、次のように呼び出します
WebCall *webCall = [[WebCall alloc] init];
[webCall setWebCallDidFinish:^(NSString *str){
//This method is called as as soon as the web call is finished
NSLog(@"%@", str);
}];
//Make web call here
[webCall webServiceCall:@"http://www.bbc.co.uk/" :nil :nil];
setWebCallDidFinish メソッドを参照してください。Web コールが終了するまで呼び出されません。したがって、アニメーションを停止するなど、Web 呼び出しが終了したらすぐにコードを実行する必要がある場合は、そのメソッドで呼び出します。それが役立つことを願っています