2017-05-26 11 views
0

文字列値の出力をAsyncTaskから取得したいと考えています。そして、それをメインスレッドの変数に格納します。どうすればいいですか?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); 
    } 

} 

答えて

1

AsyncTaskの目的は、メインスレッドを解放し、UXの問題を回避するために、別のスレッドで非同期タスクを実行することです。目的のために、AsyncTaskの中のtryブロック内のすべての作業を転送し、実行後にUIを更新することをお勧めします。この

MainThread

new ReceiveData().execute(); 
AsyncTask

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"); 
     } 
    } 
} 

注意ごAsyncTaskがあなたの活動の中で定義されている場合のみ動作ような

何か。そうでない場合は、AsyncTaskからインターフェイスを作成し、それをアクティビティに実装して有効にする必要があります。onPostExecute

+0

私はあなたのメソッドを試していますが、配置したらsetText関数を実行すると、 onpost内で実行 – Learning2code

+0

アクティビティコード全体を投稿できますか? – tompee

+0

アクティビティコードを – Learning2code

関連する問題