为什么AsyncTask只能正常工作2次?

时间:2017-01-10 01:22:00

标签: android android-asynctask

当我打开新的Activity时,我会运行新的AsyncTask来实时更新TextView。完成ActivityAsyncTask被取消。当我打开和关闭此Activity两次时,一切都正常。但是在第三次和其他所有方法 - doInBackground方法永远不会开始,尽管任务状态是" RUNNING"。代码看起来像这样。

打开活动:

list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            final String selectedFromList = (list.getItemAtPosition(position).toString());

            Context context = getApplicationContext();
            Intent intent = new Intent(context, Main2Activity.class);
            intent.putExtra("NetworkText", txts.getText());
            intent.putExtra("ChooseCompTitle", new String(selectedFromList));
            startActivity(intent);
            overridePendingTransition(R.anim.right_in, R.anim.left_out);
        }
    });

&#34;的onCreate&#34;开始执行AsyncTask:

ConnectionDataPack supportDesktopData;
UpdateTextView taskUpdateText;

 protected void onCreate(Bundle savedInstanceState) {
    . . . .

    final TextView txts = (TextView) findViewById(R.id.textView2);
    final ScrollView scroll = (ScrollView) findViewById(R.id.ScrollView01);
    final TextView textContent = (TextView) findViewById(R.id.textView4);

    if(getIntent().getExtras().getString("NetworkText") != null){
        txts.setText(getIntent().getExtras().getString("NetworkText"));
    }

    if(getIntent().getExtras().getString("ChooseCompTitle") != null){
        supportDesktopData = findFitCompPack(getIntent().getExtras().getString("NetworkText"), MainActivity.connectComputer);
    }
    else finish();

    taskUpdateText = new UpdateTextView(supportDesktopData, textContent, scroll);
    taskUpdateText.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

    if(taskUpdateText.getStatus() == AsyncTask.Status.PENDING){
        Log.i("LogsX", "AsyncTask has not started yet.");
    }
    if(taskUpdateText.getStatus() == AsyncTask.Status.RUNNING){
        Log.i("LogsX", "AsyncTask is currently doing work.");
    }
    if(taskUpdateText.getStatus() == AsyncTask.Status.FINISHED){
        Log.i("LogsX", "AsyncTask is done");
    }
   . . . .

}

我也覆盖了finish方法:

 public void finish() {
    super.finish();
    if(!taskUpdateText.isCancelled()) {
        Log.i("LogX", "End AsyncTask!");
        taskUpdateText.cancel(true);
    }
    else Log.i("LogX", "Asynctask is already cancell!");
    overridePendingTransition(R.anim.left_in, R.anim.right_out);
}

因为我必须在Activity完成时关闭此AsyncTask。

AsyncTask看起来像这样:

class UpdateTextView extends AsyncTask<Void, Void, Void>
{
    int lengthTextBuffor = 0;

    ConnectionDataPack compDataPack;
    TextView textUpdate;
    ScrollView scrool;

    public UpdateTextView(ConnectionDataPack compDataPack, TextView textUpdate, ScrollView scrool)
    {
        this.compDataPack = compDataPack;
        this.textUpdate = textUpdate;
        this.scrool = scrool;
    }

    protected void onProgressUpdate(Void... params) {
          textUpdate.setText(compDataPack.dataBackupCharacter.toString());
            scrool.fullScroll(View.FOCUS_DOWN);
    }

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

        Log.i("LogX", "doInBackground Starts!");
        boolean startLoop = true;
        while(true)
        {
               synchronized (compDataPack.lock){
                if(!startLoop && lengthTextBuffor == compDataPack.dataBackupCharacter.length()) {
                    try {
                        compDataPack.lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }   
                startLoop = false;
                publishProgress();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

尝试以下代码..

if (taskUpdateText != null && taskUpdateText.getStatus() == AsyncTask.Status.PENDING) {
            taskUpdateText.execute();
        } else if (taskUpdateText == null || taskUpdateText.getStatus() == AsyncTask.Status.FINISHED) {
            taskUpdateText = new UpdateTextView();
            taskUpdateText.execute();
        }

并在onDestroy()中输入以下代码

@Override
    public void onDestroyView() {
        super.onDestroyView();
        if (taskUpdateText != null && taskUpdateText.getStatus() == AsyncTask.Status.RUNNING) {
            taskUpdateText.cancel(true);
        }
    }

答案 1 :(得分:0)

这些问题可能是你的asyntask没有被垃圾收集,或者它仍然在后台运行。

尝试使用以下代码

            List<int> list = new List<int>();
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                list.Add(Convert.ToInt32(dr["Qulif_code"]));

            }
            int[] arr = list.ToArray();

            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] == 1)
                {
                    ck_ol.Checked==true ;
                }

            }