2016-07-04 15 views
-1

30秒ごとにコードを作成して送信するアプリケーションを設定しようとしています。コードはWebサービス経由でデータベースに送られます。 私はアプリを実行するたびに、それは最初の時間を動作しますが、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> 

私はの作品を含めています私が使用するコード:

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 
    } 
01:

//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(); 
    } 
} 

IとしてHttpAsyncTaskを実行します

+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を使用して文字列を取得できます。または私はちょっと最近にして本当に好きだったRetroFit(https://github.com/square/retrofit)です。あなたは(ハニカム上記)アプリのAPIを11+実行している場合

・ホープ、このことができます、 Gavさん

1

はこれを試してみてください。..

​​

これはあなたを助けることを願っています。

関連する問題