1

UIThread を遅延させずに while ループで遅延を利用するにはどうすればよいですか? while ループは、アプリがループを実行するたびに UI を更新する必要がありますが、ボタンを操作する可能性もあるはずです。私が現在のバージョンで抱えている問題は、while ループが開始されると while ループが終了するまでアプリが一時停止し、その後 UI が更新されることです。パススルーごとにUIを更新したい。

アイデアはありますか、より効率的な代替方法もありますか?

これは私の現在のバージョンです:

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Button;
import android.widget.ProgressBar;
import android.view.View.OnClickListener;
import android.widget.Toast;
import java.util.regex.Pattern;


public class ReaderFragment extends Fragment
{

ProgressBar progress_in_main_thread;
private int progressBarStatus = 0;
TextView main_text;
Pattern p = Pattern.compile(" ");
String[] splitted_text;
Button start_button;
Button pause_button;
public boolean paused;
int index = 0;
long wait = 1000;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
//Layout des Fragments verknuepfen
{
    View ReaderFragmentView = inflater.inflate(R.layout.reader_fgmt, container, false);

    progress_in_main_thread = (ProgressBar) ReaderFragmentView.findViewById(R.id.reader_progress);
    progress_in_main_thread.setProgress(0);
    progress_in_main_thread.setVisibility(progress_in_main_thread.VISIBLE);

    main_text = (TextView) ReaderFragmentView.findViewById(R.id.center_view);

    start_button = (Button) ReaderFragmentView.findViewById(R.id.go);
    start_button.setOnClickListener(new OnClickListener()
    {
       @Override
       public void onClick(View view)
       {
           if(InputFragment.text.trim().length() == 0)
           {
               Toast.makeText(getActivity().getApplicationContext(), "Es wurde kein Text eingegeben!", Toast.LENGTH_SHORT).show();
           }
           else
           {
               paused = false;
               splitted_text = p.split(InputFragment.text);
               progress_in_main_thread.setMax(splitted_text.length-1);

               mainThread();
           }

       }
    });

    pause_button = (Button) ReaderFragmentView.findViewById(R.id.pause);
    pause_button.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
                paused = true;
        }
    });




    return ReaderFragmentView;
}

private void mainThread()
{
    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            while(progressBarStatus < (splitted_text.length)-1)
            {
                progressBarStatus = index;

                progress_in_main_thread.setProgress(progressBarStatus);
            }
        }
    }).start();

    getActivity().runOnUiThread(new Runnable()
    {
        public void run()
        {

        while(!paused)
        {
           main_text.setText(splitted_text[index]);

           if(paused)
           {
                break;
           }
           else if(index == (splitted_text.length)-1)
           {
                Toast.makeText(getActivity().getApplicationContext(), "Ende", Toast.LENGTH_LONG).show();
                break;
           }
            index++;
            try
            {
                Thread.sleep(wait);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }

        }

    });
}
}

皆さん、ありがとうございました!

4

1 に答える 1