2016-07-04 2 views
-1

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 
    } 
+0

로그를 업데이트하십시오. –

+0

전체 로그 게시 – Jas

+0

글쎄,'urls'이 비어있는 것 같습니다 ... 또한 반복적 인 작업을 위해서는 ScheduledExecutorService를 사용하는 것이 좋습니다. – Fildor

답변

1

매개 변수를 사용하여 AsyncTask를 호출하는 것처럼 보이지 않습니다.

execute 메서드를 호출하면 매개 변수를 제공해야합니다. 예를 들면 : asside으로

public void run() { 
    try { 
     HttpAsyncTask mytask = new HttpAsyncTask(); 
     // PerformBackgroundTask this class is the class that extends AsynchTask 
     mytask.execute("https://www.google.com"); 
    } catch (Exception ignore) { 
     // TODO Auto-generated catch block 
    } 
} 

, 그것은 발리와 같은 라이브러리 (https://developer.android.com/training/volley/index.html)를 사용하여 더 나은 수 있습니다. Gradle compile 'com.android.volley:volley:1.0.0' 종속성을 사용하여 프로젝트에 라이브러리를 포함 할 수 있습니다.

이렇게하면 StringRequest을 사용하여 String을 얻을 수 있으며 훨씬 간단합니다 (InputStreams 등을 사용할 필요가 없음). 또는 RetroFit (https://github.com/square/retrofit) 나는 최근에 조금 놀았으며 정말 좋아했습니다. 당신이 (벌집 위) 앱 API 11 + ..

HttpAsyncTask mytask = new HttpAsyncTask(); 
    // PerformBackgroundTask this class is the class that extends AsynchTask 
    mytask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

희망을 실행하는 경우이 도움이

희망, 개브

1

이 당신을 도울 것이보십시오.