2016-12-31 138 views
0

我是初學者到android。我做了以下應用程序,從用戶那裏花費時間和睡眠時間,並在睡眠期間顯示進度對話框。現在問題是它第一次正常工作,但它在第二次崩潰。再次啓動會出現同樣的問題。與Android中的AsyncTask相關的問題

下面是代碼:需要

package com.example.asynctask; 

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 


public class Main extends AppCompatActivity { 

    AsyncTaskExecutor executor; 
    EditText text; 
    Button button; 
    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     executor = new AsyncTaskExecutor(); 
     text = (EditText)findViewById(R.id.editText); 
     button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         executor.execute(text.getText().toString()); 
        } 
       } 
     ); 
    } 

    class AsyncTaskExecutor extends AsyncTask<String, String, String> { 

     String res; 
     ProgressDialog pd; 


     @Override 
     protected void onPreExecute(){ 
      pd = new ProgressDialog(Main.this); 
      pd.setMessage("Sleeping.."); 
      pd.setCancelable(false); 
      pd.setTitle("Please wait"); 
      pd.show(); 
     } 

     @Override 
     protected String doInBackground(String... params){ 

      int time = Integer.parseInt(params[0]); 
      try 
      { 
       Thread.sleep(time); 
       res = "successfull"; 
      }catch (InterruptedException e){ 
       e.printStackTrace(); 
       res = e.getMessage(); 
      } 
      publishProgress(res); 
      return res; 
     } 

     @Override 
     protected void onPostExecute(String result){ 
      pd.dismiss(); 
     } 

     @Override 
     protected void onProgressUpdate(String... a){ 
      pd.setMessage(a[0]); 
     } 
    } 

} 

幫助。

+0

@Override public void onClick(View view){ executor = new AsyncTaskExecutor(); executor.execute(text.getText()。toString()); } – xFighter

+0

你可以發佈你的logcat嗎? – sasikumar

+0

把這一行executor = new AsyncTaskExecutor();在按鈕點擊之前和executor.execute(text.getText()。toString())之前; – Nainal

回答

1

根據谷歌的文檔

AsyncTask Threading rules :任務只能執行一次(如果第二試圖執行一個異常將被拋出。)

,所以你必須創建新的對象,每次

button.setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        executor = new AsyncTaskExecutor(); 
        executor.execute(text.getText().toString()); 
       } 
      } 
    ); 
1

這裏是溶液

刪除此行---

執行人=新AsyncTaskExecutor();

並添加按鈕點擊如下。

button = (Button)findViewById(R.id.button); 
    button.setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        executor = new AsyncTaskExecutor(); 
        executor.execute(text.getText().toString()); 
       } 
      } 
    ); 

希望你明白。

-1

如果使用executor.execute()方法和您的Android版本是> =蜂窩比高達的和roid系統何時啓動AsyncTask。所以這是問題。要強制執行Asynctask,您必須按如下所示執行操作。

executor = new AsyncTaskExecutor(); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      executor.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } else { 
      executor.execute(); 
     } 

希望它能起作用。

+0

這是不完全正確的。在Honeycomb +(和1.6-)上,所有的異步任務都是在一個線程上完成的。直到所有先前的完成後才能啓動新的。所以它並不是說系統會推遲它,而是另一個已經在運行。但是這是一個異步任務 - 如果你的代碼依賴於它立即開始,無論如何你都有競爭條件。你永遠不知道什麼時候底層Linux操作系統會真正運行相對於舊版本的新線程。 –

+0

同樣,那不是他的問題。他的問題是一個異步任務只能在每個實例中執行一次。 –

+0

執行次序: 第一次引入時,AsyncTasks在單個後臺線程上被串行執行。從DONUT開始,將其更改爲允許多個任務並行操作的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行導致的常見應用程序錯誤。 如果你真的想要並行執行,你可以調用executeOnExecutor(java.util.concurrent。執行器,對象[])與THREAD_POOL_EXECUTOR。參考:https://developer.android.com/reference/android/os/AsyncTask.html – MdFazlaRabbiOpu