/ / एक्सटारिन पीसीएल सॉल्यूशन में इंटेंटसेवा

Xamarin PCL सॉल्यूशन में इंटेंटसेवा - xamarin, xamarin.forms, xamarin.android, इंटेंसवर्क

मैं एक एप्लिकेशन लिखने में व्यस्त हूं जहां उपयोगकर्ताबहुत सारी छवियों को कैप्चर करने की आवश्यकता होती है और फिर वे कुछ टेक्स्ट डेटा के साथ पैक हो जाते हैं और फिर वे एक स्थानीय सर्वर पर अपलोड हो जाते हैं। मैं एक इरादे सेवा के माध्यम से एंड्रॉइड प्लेटफ़ॉर्म पर अपलोडिंग को लागू करना चाहता हूं, लेकिन मुझे यह दिखाने के लिए एक अच्छा ज़मारिन फॉर्म पीसीएल उदाहरण नहीं मिल सकता है।

यह वह विधि है जहाँ मैं आशय को IntentService में पारित करने के लिए आरंभ करता हूँ:

public async Task<bool> UploadAsync(Uri serviceAddress,
CaptureEntity capture,
List<ImageEntity> images)
{
try
{
Intent uploadIntent = new Intent();
uploadIntent.PutExtra("serviceAddress", serviceAddress.ToString());
uploadIntent.PutExtra("captureId", capture.WorkflowId.ToString());
StartService(uploadIntent);

return true;
}
catch (Exception exc)
{
App.logger.LogError(DateTime.Now, "Uploader", exc.ToString());
throw exc;
}
}

और यह IntentService ही है।

[Service]
public class ServiceIntent : IntentService
{
public ServiceIntent() : base("ServiceIntent")
{

}

//[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
return base.OnStartCommand(intent, flags, startId);
}

public override void OnCreate()
{
base.OnCreate();
}

protected override void OnHandleIntent(Intent intent)
{
Uri serviceAddress = new Uri(intent.GetStringExtra("serviceAddress"));
Guid captureId = Guid.Parse(intent.GetStringExtra("captureId"));
CaptureEntity capture = new DatabaseConnection_Android().CreateConnection().Query<CaptureEntity>("SELECT * FROM [CaptureEntity]").Single(c => c.WorkflowId == captureId);
var images = new DatabaseConnection_Android().CreateConnection().Query<ImageEntity>("SELECT * FROM [ImageEntity]").Where(i => i.CaptureEntityId == capture.Id);
try
{
MultipartFormDataContent content = new MultipartFormDataContent();
StringContent strContent = new StringContent(
capture.XmlData,
Encoding.UTF8,
"text/xml");
IImageHandler handler = new ImageHandler_Droid();

HttpRequestMessage request = new HttpRequestMessage();
request.Headers.Add("workflow", capture.WorkflowId.ToString());
request.Method = HttpMethod.Post;
request.RequestUri = serviceAddress;

foreach (var image in images)
{
byte[] imageByte = handler.ReadAllBytes(image.ImagePath);
ByteArrayContent byteContent = new ByteArrayContent(imageByte);
byteContent.Headers.Add("Content-Type", "image/jpeg");
content.Add(byteContent, "file", image.ImageName);
}
content.Add(strContent, "text/xml");

request.Content = content;

using (HttpClient client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(180);

var response = client.SendAsync(
request,
HttpCompletionOption.ResponseContentRead).Result;

var readResponse = response.Content.ReadAsStringAsync().Result;

if (readResponse == "File uploaded.")
MessagingCenter.Send<CaptureEntity, string>(
capture,
"Completed",
"Success");
else if (readResponse.Contains("An error has occurred."))
MessagingCenter.Send<CaptureEntity, string>(
capture,
"Uploader",
String.Format(CultureInfo.InvariantCulture,
"Failed: {0}",
readResponse));
else
MessagingCenter.Send<CaptureEntity, string>(
capture,
"Uploader",
String.Format(CultureInfo.InvariantCulture,
"Failed: {0}",
readResponse));
}
}
catch (WebException webExc)
{
MessagingCenter.Send<string, string>("Uploader", "Failed",
String.Format(CultureInfo.InvariantCulture,
"{0} upload failed.n{1}",
capture.DisplayName,
webExc.Message));
}
catch (TimeoutException timeExc)
{
MessagingCenter.Send<string, string>("Uploader", "Failed",
String.Format(CultureInfo.InvariantCulture,
"{0} upload failed.n{1}",
capture.DisplayName,
timeExc.Message));
}
catch (Exception exc)
{
MessagingCenter.Send<string, string>("Uploader", "Failed",
String.Format(CultureInfo.InvariantCulture,
"{0} upload failed.n{1}",
capture.DisplayName,
exc.Message));
}
}
}

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं क्योंकि मुझे सेवा शुरू करने के लिए निम्नलिखित त्रुटि हो रही है:

Java.Lang.NullPointerException: वर्चुअल पद्धति "android.content.ComponentName android.content.Context.startService (android.content.Intent)" को एक अशक्त ऑब्जेक्ट संदर्भ पर लागू करने का प्रयास करें

उत्तर:

उत्तर № 1 के लिए 1

आपके में Intent घोषणा आपको उस सेवा को बताने की आवश्यकता है जिसे आप कॉल करना चाहते हैं

कुछ इस तरह:

var uploadIntent = new Intent(this, typeof(ServiceIntent));

ध्यान दें: this का प्रतिनिधित्व करता है Context.

अद्यतन करें:

जैसा कि टिप्पणियों में उल्लेख किया गया है कि आपका इंटरफ़ेस कार्यान्वयन से नहीं निकल सकता Activity कक्षा। आदेश में का उपयोग करने के लिए Context कॉल करने में सक्षम होने के लिए StartService तरीका और अपना भी बनाएं Intent आप इसे दो तरीकों से बना सकते हैं:

का उपयोग करते हुए Xamarin.Forms.Forms.Context:

public async Task<bool> UploadAsync(Uri serviceAddress,
CaptureEntity capture,
List<ImageEntity> images)
{
try
{
var context = Xamarin.Forms.Forms.Context;
var uploadIntent = new Intent(context, typeof(ServiceIntent));
uploadIntent.PutExtra("serviceAddress", serviceAddress.ToString());
uploadIntent.PutExtra("captureId", capture.WorkflowId.ToString());
context.StartService(uploadIntent);

return true;
}
catch (Exception exc)
{
App.logger.LogError(DateTime.Now, "Uploader", exc.ToString());
throw exc;
}
}

यदि आप Xamarin के नवीनतम संस्करणों का उपयोग कर रहे हैं।इस वैश्विक संदर्भ के रूपों को हटा दिया गया था और वे आपको इसके बजाय स्थानीय संदर्भ का सुझाव देते हैं। आप इसे अभी भी उपयोग कर सकते हैं, लेकिन XF के भविष्य के अपडेट में आपका ऐप टूट सकता है।

का उपयोग करते हुए वर्तमान कार्य लगाना:

public async Task<bool> UploadAsync(Uri serviceAddress,
CaptureEntity capture,
List<ImageEntity> images)
{
try
{
var context = CrossCurrentActivity.Current.Activity;
var uploadIntent = new Intent(context, typeof(ServiceIntent));
uploadIntent.PutExtra("serviceAddress", serviceAddress.ToString());
uploadIntent.PutExtra("captureId", capture.WorkflowId.ToString());
context.StartService(uploadIntent);

return true;
}
catch (Exception exc)
{
App.logger.LogError(DateTime.Now, "Uploader", exc.ToString());
throw exc;
}
}

यह प्लगइन नौगट से स्थापित किया जा सकता है और सेटअप बहुत आगे है। मूल रूप से यह आपको वर्तमान गतिविधि तक पहुंच प्रदान करता है और आप इसे कॉल करने के लिए अपने संदर्भ के रूप में उपयोग कर सकते हैं IntentService

उम्मीद है की यह मदद करेगा।-


जवाब के लिए 0 № 2

यहाँ है IntentService.

IntentService सेवाओं के लिए एक आधार वर्ग है जोमांग पर अतुल्यकालिक अनुरोधों (इरादों के रूप में व्यक्त) को संभालें। ग्राहक startService (इरादे) कॉल के माध्यम से अनुरोध भेजते हैं; सेवा को आवश्यकतानुसार शुरू किया जाता है, प्रत्येक इंट्रेंट को वर्कर थ्रेड का उपयोग करके संभालता है, और जब यह काम से बाहर हो जाता है तो खुद को रोक लेता है।

एंड्रॉइड में, हम आमतौर पर उपयोग करते हैं IntentService अतुल्यकालिक ऑपरेटर करने के लिए। जैसा कि हम सभी जानते हैं कि एसिंक्रोनस ऑपरेटर को करने के लिए भी धागे का उपयोग किया जाता है। बीच में अंतर IntentService तथा Thread है IntentService है Service जो Android Component के अंतर्गत आता है। तो, की प्राथमिकता IntentService ये उससे ऊंचा है Thread.

उदाहरण के लिए, वहाँ एक है ActivityA जिसमें एक है IntentService, और एक है ActivityB जिसमें एक है Thread, दोनों IntentService तथा Thread काम कर रहे हैं, और दोनों ActivityA तथा ActivityB अल बैकग्राउंड हैं Activity। अब, यदि आपके फोन के सिस्टम में अतिरिक्त संसाधन नहीं हैं, तो ActivityB पहले मार दिया जाएगा।

Java.Lang.NullPointerException: वर्चुअल पद्धति "android.content.ComponentName android.content.Context.startService (android.content.Intent)" को एक अशक्त ऑब्जेक्ट संदर्भ पर लागू करने का प्रयास करें

इसका मतलब है कि आपको उपयोग करना चाहिए android.content.Context कॉल करने के लिए StartService तरीका। Android में, तीन प्रकार के होते हैं Context. आवेदन, गतिविधि तथा सर्विस। तो आप कॉल कर सकते हैं StartService सीधे इन तीन वर्गों में विधि। यदि आप इन तीन वर्गों में नहीं हैं, तो आपको पास होने की आवश्यकता है Context अपनी कक्षा में, और फिर उपयोग करें Context बुलाना StartService.

मैंने इस वर्ग के लिए "विरासत" गतिविधि को जोड़ा।

यदि आप ऐसा करते हैं, तो आपकी कक्षा एक होगी Activity, और आपको इसे अपने मैनिफ़ेस्ट में पंजीकृत करने की आवश्यकता है,अपनी कक्षा के लिए लेआउट जोड़ें, और इसमें जीवनचक्र होना चाहिए, और यह वह नहीं होगा जो आप वर्ग प्राप्त करना चाहते हैं। एंड्रॉइड में, गतिविधि एक घटक है, सामान्य वर्ग नहीं है, इसलिए आप इसे तब तक विरासत में ले सकते हैं जब तक कि आप नहीं चाहते कि आपकी कक्षा एक गतिविधि हो।

डेमो:

मैंने एक बनाया है डेमो आपके लिए,