【问题标题】:AsyncTask get String value output and store in mainthread variableAsyncTask 获取字符串值输出并存储在主线程变量中
【发布时间】:2017-05-26 02:11:25
【问题描述】:

我想从AsyncTask 获取字符串值输出。并将其存储到我的主线程上的变量中。我该怎么做?

我试图做store = new ReceiveData().execute().get() 但是它抛出了一个执行异常错误。但无论如何,我的问题不是关于执行异常错误。我只是需要一种方法来取出字符串,请帮忙!

这是我的活动代码:

public class MainActivity extends AppCompatActivity {  //MAIN ACTIVITIES (REMOTE)

double multiplier;
int seekbarvalue, finallumens;

@Override
protected void onCreate(Bundle savedInstanceState) {
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); //On orientation change socket will disconnect...
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Toast.makeText(MainActivity.this, LoginActivity.SERVER_IP, Toast.LENGTH_LONG).show();


    //================START AFTER DEFAULT ON CREATE=================
    SeekBar seekbarbrightness = (SeekBar) findViewById(R.id.seekbarbrightness);
    final TextView tblumens, tbvolts, tbamps;

    tblumens = (TextView) findViewById(R.id.tblumens);
    seekbarvalue = seekbarbrightness.getProgress();
    multiplier = (double) seekbarvalue / 100;
    finallumens = (int) (multiplier * LoginActivity.enterlumens);
    tblumens.setText(String.valueOf(finallumens) + " Lumens");

    tbvolts = (TextView) findViewById(R.id.tbvolts);
    tbamps = (TextView) findViewById(R.id.tbamps);

    seekbarbrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekbarbrightness, int progress, boolean b) {
            if (b == true) {
                seekbarvalue = seekbarbrightness.getProgress();
                multiplier = (double) seekbarvalue / 100;
                finallumens = (int) (multiplier * LoginActivity.enterlumens);
                tblumens.setText(String.valueOf(finallumens) + " Lumens");
                if (LoginActivity.getSocket() != null) {
                    try {
                        LoginActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());
                        new ReceiveData().execute();
                        //infinite loop here to keep receiving volts and amperes.
                        //Do a split and assign value to volt and amp
                        //String[] strrecv= store.split("|");
                        //String volts = strrecv[0];
                        //String amps = strrecv[1];
                        //tbvolts.setText("Voltage: " + volts + " V");
                        //tbamps.setText("Amperes:" + amps + " A");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                } else {
                    Toast.makeText(MainActivity.this, "NOT connected To Socket, please disconnect and reconnect!", Toast.LENGTH_SHORT).show();
                }
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });




}

在我的Asynctask 中,我正在这样做。

class ReceiveData extends AsyncTask<Void, Void, String> {
    String str;
    protected String doInBackground(Void... args) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(LoginActivity.getSocket().getInputStream()));
            str = in.readLine();
            return str;

        } catch (IOException e) {
            e.printStackTrace();
            String str = "fail";
            return str;
        }

    }

    protected void onPostExecute(String str) {
        //super.onPostExecute(str);
    }

}

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    AsyncTask 的目的是在单独的线程中执行异步任务以释放主线程并避免 UX 问题。出于您的目的,我建议将所有工作转移到 AsyncTask 内的 try 块中,并在执行后更新 UI。

    类似的东西

    在主线程中

    new ReceiveData().execute();
    

    在异步任务中

    class ReceiveData extends AsyncTask<Void, Void, Boolean> {
        String volts;
        String amps;
    
        protected Boolean doInBackground(Void... args) {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(LoginActivity.getSocket().getInputStream()));
                str = in.readLine();
                String[] strrecv= store.split("|");
                volts = strrecv[0];
                amps = strrecv[1];
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }
    
        protected void onPostExecute(Boolean result) {
            if (result) {
                tbvolts.setText("Voltage: " + volts + " V");
                tbamps.setText("Amperes:" + amps + " A");
            }
        }
    }
    

    请注意,这仅在您的 Activity 中定义了 AsyncTask 时才有效。如果没有,您需要从AsyncTask 创建一个接口并在您的活动中实现它并激活它onPostExecute

    【讨论】:

    • 我正在尝试你的方法,但是如果我将它放在 onpost 执行中,我在运行 setText 函数时无法更改文本
    • 问题出在你的 textview 变量中。它们在您的 onCreate 函数中本地定义,然后它们的实例被销毁。你需要坚持他们。而是将它们定义为类属性(字段)。此外,在您的活动中定义您的异步任务,以便它可以访问 textview 对象。
    • 好的,我明白你的意思。现在效果很好!太感谢了! :) 我从来没有想过在 onpostexecution 中进行字符串拆分和文本设置..
    • 很高兴它有帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多