30 초마다 코드를 생성하고 보내는 앱을 설정하려고합니다. 코드는 웹 서비스를 통해 데이터베이스로 전송됩니다. 나는 응용 프로그램을 실행 할 때마다 , 그것은 처음 작동하지만 30 초 만료되는 경우, 다음과 같은 오류가 있습니다 : 라인에서주어진 간격으로 비동기 작업 실행
app E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at andreea.example.com.mobileapp.CodeGeneratorActivity$HttpAsyncTask.doInBackground(CodeGeneratorActivity.java:196)
at andreea.example.com.mobileapp.CodeGeneratorActivity$HttpAsyncTask.doInBackground(CodeGeneratorActivity.java:181)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
: 나는의 조각을 포함하고
1. String post = POST(urls[0], my_code);
2. private class HttpAsyncTask extends AsyncTask<String, Void, String>
을 코드 내가 사용하는 :
//POST request to add new user
public String POST(String url, CodeClass code)
{
String result = "";
InputStream inputStream = null;
try{
HttpClient httpclient;
HttpPost httppost;
ArrayList<NameValuePair>postParameters;
httpclient = new DefaultHttpClient();
httppost = new HttpPost(url);
postParameters = new ArrayList<>();
postParameters.add(new BasicNameValuePair("code", code_gen.getText().toString()));
httppost.setEntity(new UrlEncodedFormEntity(postParameters));
HttpResponse httpresponse = httpclient.execute(httppost);
inputStream = httpresponse.getEntity().getContent();
if(inputStream != null)
{
result = convertInputStreamToString(inputStream);
}
else
{
result = "Did not work";
}
}catch (Exception e)
{
e.getLocalizedMessage();
}
return result;
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
String auxcode = code_gen.getText().toString();
final String url = my_url_builder();
@Override
protected String doInBackground(String... urls) {
final ServiceHandler sh = new ServiceHandler();
jsonStr = sh.makeServiceCall(url, ServiceHandler.POST);
my_code = new CodeClass();
my_code.setCode(auxcode); //HERE!!
String post = POST(urls[0], my_code);
System.out.println(urls[0]+" This is the urls0");
count++;
return post;
}
// onPostExecute displays the results of the AsyncTask.
protected void onPostExecute(String result) {
HttpAsyncTask new_instance = new HttpAsyncTask();
//new_instance.execute();
Toast.makeText(getBaseContext(), "Yup", Toast.LENGTH_SHORT).show();
}
}
내가 실행 HttpAsyncTask로 :
public void timer_code() {
final Random rand = new Random();
n = rand.nextInt(999999)+100000;
code_gen.setText(String.valueOf(n));
mytask = new HttpAsyncTask();
test = my_url_builder();
// mytask.execute(test);
//System.out.println(nativePRNG.toString()+"Try code");
new CountDownTimer(30000,1000){
@Override
public void onTick(long millisUntilFinished) {
timer.setText(String.format(String.valueOf(TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished))));
}
public void onFinish()
{
n = rand.nextInt(999999)+100000;
code_gen.setText(String.valueOf(n));
//mytask = new HttpAsyncTask();
callAsynchronousTask();
// mytask.execute(test);
this.start();
}
}.start();
}
public void callAsynchronousTask() {
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
try {
HttpAsyncTask mytask = new HttpAsyncTask();
// PerformBackgroundTask this class is the class that extends AsynchTask
mytask.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
};
timer.schedule(doAsynchronousTask, 0, 30000); //execute in every 50000 ms
}
로그를 업데이트하십시오. –
전체 로그 게시 – Jas
글쎄,'urls'이 비어있는 것 같습니다 ... 또한 반복적 인 작업을 위해서는 ScheduledExecutorService를 사용하는 것이 좋습니다. – Fildor