2017-03-27 2 views
0

J'ai défini la variable globale comme public static int ABC;android AsyncTask share variable (variable globale)

et d'exécuter asynctask.

Ensuite, attribuez onPostExecute ABC à 5. maintenant ABC est 5.

Mais, thread d'interface utilisateur pas ABC avec 5, juste ont variable nulle.

comment puis-je partager la variable globale entre asynctask et thread de l'interface utilisateur ??

mon code est

public class ProjetInfo étend AppCompatActivity {

private Boolean isFabOpen = false; // Fab 세팅 
private FloatingActionButton fab1, fab2, fab3, fab4; // fab1 -> + , fab2 -> , fab3 -> , fab4 -> 
private TextView textSubjectAdd, textSubjectCorrect, textSubjectDelete; 
private Animation fab_open, fab_close, rotate_forward, rotate_backward; 

private Spinner ProjectSpinner; 
private ArrayList<String> SpinnerList = new ArrayList<String>(); 
private String SubjectName = null; // 주제 추가에 쓰이는 변수 
private int flagSpinner = 0; // 주체 추가 완료를 했으면 1로 되서 Spinner을 세로 set 해준다. 

// DB 관련 변수 // 
private static String[] listSubjectDB; // DB의 결과를 받아오는 변수 
private String[] Subjecttemp; // listDB를 <br> 단위로 끊어서 받음 
private String PROJ_SEQ; // 프로젝트 SEQ를 받는다. 
private static ArrayAdapter<String> Subjectadapter; // 스피너 어댑터 
/** 
* ATTENTION: This was auto-generated to implement the App Indexing API. 
* See https://g.co/AppIndexing/AndroidStudio for more information. 
*/ 
private GoogleApiClient client; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // 프로젝트 SEQ를 받아온다. 
    Intent intent = getIntent(); 
    PROJ_SEQ = "PROJ_SEQ=" + intent.getStringExtra("PROJ_SEQ"); 
    new HttpTaskSubject().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    //Log.i("testListDB" , "value:" + listSubjectDB.length); 

    setContentView(R.layout.activity_projectinfo); 

    // fab 관련 
    textSubjectAdd = (TextView) findViewById(R.id.textSubjectAdd); 
    textSubjectCorrect = (TextView) findViewById(R.id.textSubjectCorrect); 
    textSubjectDelete = (TextView) findViewById(R.id.textSubjectDelete); 
    fab1 = (FloatingActionButton) findViewById(R.id.fab1); 
    fab2 = (FloatingActionButton) findViewById(R.id.fab2); 
    fab3 = (FloatingActionButton) findViewById(R.id.fab3); 
    fab4 = (FloatingActionButton) findViewById(R.id.fab4); 
    fab_open = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fab_open); 
    fab_close = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fab_close); 
    rotate_forward = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate_forward); 
    rotate_backward = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate_backward); 
    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 

    // 스피너 선택 시 // 
    ProjectSpinner.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.i("spinnervalue" , "value : " + view.getTransitionName() + "/" + position); 
     } 
    }); 

} 

public void onClickFab(View v) { 
    switch (v.getId()) { 
     case R.id.fab1: // fab 추가 보여주기 
      animateFAB(); 
      break; 
     case R.id.fab2: // 주제 삭제 
      break; 
     case R.id.fab3: // 주제 수정 
      break; 
     case R.id.fab4: // 주제 추가 - dialog를 통해 구현 
      final EditText name = new EditText(this); 
      AlertDialog.Builder alert = new AlertDialog.Builder(ProjectInfo.this); 
      alert.setView(name); 
      alert.setTitle("주제 추가"); 
      alert.setPositiveButton("추가", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        SubjectName = name.getText().toString(); 
        flagSpinner = 1; 
        SpinnerAdd(); // 주제 추가 완료 버튼을 누르면 spinner 새로 set 
       } 
      }); 

      alert.setNegativeButton("취소", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); // 닫기 
        flagSpinner = 0; 
       } 
      }); 

      alert.show(); 
      break; 
    } 
} 

// FAB 애니메이션 효과 
public void animateFAB() { 
    if (isFabOpen) { 
     fab1.startAnimation(rotate_backward); 
     textSubjectAdd.startAnimation(fab_close); 
     textSubjectCorrect.startAnimation(fab_close); 
     textSubjectDelete.startAnimation(fab_close); 
     fab2.startAnimation(fab_close); 
     fab3.startAnimation(fab_close); 
     fab4.startAnimation(fab_close); 
     fab2.setClickable(false); 
     fab3.setClickable(false); 
     fab4.setClickable(false); 
     isFabOpen = false; 
     Log.d("Raj", "close"); 
    } else { 
     fab1.startAnimation(rotate_forward); 
     textSubjectAdd.startAnimation(fab_open); 
     textSubjectCorrect.startAnimation(fab_open); 
     textSubjectDelete.startAnimation(fab_open); 
     fab2.startAnimation(fab_open); 
     fab3.startAnimation(fab_open); 
     fab4.startAnimation(fab_open); 
     fab2.setClickable(true); 
     fab3.setClickable(true); 
     fab4.setClickable(true); 
     isFabOpen = true; 
     Log.d("Raj", "open"); 
    } 
} 

// 주제 추가 완료시 (flag == 1 이면 spinner 새로 추가) 
public void SpinnerAdd() { 
    if (flagSpinner == 1) { 
     SpinnerList.add(SubjectName); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, SpinnerList); 
     ProjectSpinner.setAdapter(adapter); 

     // DB에 추가된 주자를 insert 한다. // 

    } else { 
     return; 
    } 

} 

/** 
* ATTENTION: This was auto-generated to implement the App Indexing API. 
* See https://g.co/AppIndexing/AndroidStudio for more information. 
*/ 
public Action getIndexApiAction() { 
    Thing object = new Thing.Builder() 
      .setName("ProjectInfo Page") // TODO: Define a title for the content shown. 
      // TODO: Make sure this auto-generated URL is correct. 
      .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
      .build(); 
    return new Action.Builder(Action.TYPE_VIEW) 
      .setObject(object) 
      .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
      .build(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    client.connect(); 
    AppIndex.AppIndexApi.start(client, getIndexApiAction()); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    // ATTENTION: This was auto-generated to implement the App Indexing API. 
    // See https://g.co/AppIndexing/AndroidStudio for more information. 
    AppIndex.AppIndexApi.end(client, getIndexApiAction()); 
    client.disconnect(); 
} 

// PHP 검색 쿼리 보내는 class 
public class HttpTaskSubject extends AsyncTask<String, Void, String> { 
    /* Bitmap bitmap , String image는 전역변수 */ 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     try { 

      String urlPath = "http://58.142.149.131/grad/Grad_project_list_subject.php"; 

      // 내가 보낼 데이터 (쿼리, SUBSEQ 전역변수, switch 에서 정해준다.) 
      String data = PROJ_SEQ; 

      URL url = new URL(urlPath); 
      URLConnection conn = url.openConnection(); 
      conn.setDoOutput(true); 
      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

      //추가 할 내용 - 서버 on/off 검사 

      // 문자열 전송 
      wr.write(data); 
      wr.flush(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      StringBuilder sb = new StringBuilder(); 
      String CheckNull = "0"; 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 

      CheckNull = sb.toString(); 

      if (sb.toString() != "") { 
       listSubjectDB = sb.toString().split("<br>"); 
       return sb.toString(); 
      } else { 
       return null; 
      } 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     //오류시 null 반환 
     return null; 
    } 

    //asyonTask 3번째 인자와 일치 매개변수값 -> doInBackground 리턴값이 전달됨 
    //AsynoTask 는 preExcute - doInBackground - postExecute 순으로 자동으로 실행됩니다. 
    //ui는 여기서 변경 
    protected void onPostExecute(String value) { // 스피너 불러오기 

     ProjectSpinner = (Spinner) findViewById(R.id.ProjectSpinner); 
     Subjectadapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.support_simple_spinner_dropdown_item, SpinnerList); 
     for (int i = 1; i < listSubjectDB.length; i++) { 
      Subjecttemp = split(listSubjectDB[i]); // seq/주제 <BR> 
      Subjectadapter.add(Subjecttemp[1]); 
     } 
     ProjectSpinner.setAdapter(Subjectadapter); 
     PROJ_SEQ = null; 

     super.onPostExecute(value); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

// PHP DB insert 쿼리를 보내는 class (주제추가) 
public class HttpTaskSubjectAdd extends AsyncTask<String, Void, String> { 
    /* Bitmap bitmap , String image는 전역변수 */ 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     try { 

      String urlPath = "http://58.142.149.131/grad/Grad_project_list_subject.php"; 

      // 내가 보낼 데이터 (쿼리, SUBSEQ 전역변수, switch 에서 정해준다.) 
      String data = "ADD"; 

      URL url = new URL(urlPath); 
      URLConnection conn = url.openConnection(); 
      conn.setDoOutput(true); 
      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

      //추가 할 내용 - 서버 on/off 검사 

      // 문자열 전송 
      wr.write(data); 
      wr.flush(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      StringBuilder sb = new StringBuilder(); 
      String CheckNull = "0"; 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 

      CheckNull = sb.toString(); 

      if (sb.toString() != "") { 
       listSubjectDB = sb.toString().split("<br>"); 
       return sb.toString(); 
      } else { 
       return null; 
      } 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     //오류시 null 반환 
     return null; 
    } 

    //asyonTask 3번째 인자와 일치 매개변수값 -> doInBackground 리턴값이 전달됨 
    //AsynoTask 는 preExcute - doInBackground - postExecute 순으로 자동으로 실행됩니다. 
    //ui는 여기서 변경 
    protected void onPostExecute(String value) { // 스피너 불러오기 

     ProjectSpinner = (Spinner) findViewById(R.id.ProjectSpinner); 
     Subjectadapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.support_simple_spinner_dropdown_item, SpinnerList); 
     for (int i = 1; i < listSubjectDB.length; i++) { 
      Subjecttemp = split(listSubjectDB[i]); // seq/주제 <BR> 
      Subjectadapter.add(Subjecttemp[1]); 
     } 
     ProjectSpinner.setAdapter(Subjectadapter); 
     PROJ_SEQ = null; 
     super.onPostExecute(value); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

// PHP 주제에 해당하는 파일 불러오는 통신 class 
public class HttpTaskSubjectShow extends AsyncTask<String, Void, String> { 
    /* Bitmap bitmap , String image는 전역변수 */ 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     try { 

      String urlPath = "http://58.142.149.131/grad/Grad_project_list_subject.php"; 

      // 내가 보낼 데이터 (쿼리, SUBSEQ 전역변수, switch 에서 정해준다.) 
      String data = "ADD"; 

      URL url = new URL(urlPath); 
      URLConnection conn = url.openConnection(); 
      conn.setDoOutput(true); 
      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

      //추가 할 내용 - 서버 on/off 검사 

      // 문자열 전송 
      wr.write(data); 
      wr.flush(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

      StringBuilder sb = new StringBuilder(); 
      String CheckNull = "0"; 
      String line = null; 

      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 

      CheckNull = sb.toString(); 

      if (sb.toString() != "") { 
       listSubjectDB = sb.toString().split("<br>"); 
       return sb.toString(); 
      } else { 
       return null; 
      } 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     //오류시 null 반환 
     return null; 
    } 

    //asyonTask 3번째 인자와 일치 매개변수값 -> doInBackground 리턴값이 전달됨 
    //AsynoTask 는 preExcute - doInBackground - postExecute 순으로 자동으로 실행됩니다. 
    //ui는 여기서 변경 
    protected void onPostExecute(String value) { // 스피너 불러오기 

     ProjectSpinner = (Spinner) findViewById(R.id.ProjectSpinner); 
     Subjectadapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.support_simple_spinner_dropdown_item, SpinnerList); 
     for (int i = 1; i < listSubjectDB.length; i++) { 
      Subjecttemp = split(listSubjectDB[i]); // seq/주제 <BR> 
      Subjectadapter.add(Subjecttemp[1]); 
     } 
     ProjectSpinner.setAdapter(Subjectadapter); 
     PROJ_SEQ = null; 
     super.onPostExecute(value); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

// listDB를 #단위로 끊어서 반환 
public String[] split(String temp123) { 
    String[] temp2 = temp123.split("#"); 
    return temp2; 
} 

}

je veux que le travail ProjectSpinner sur thread d'interface utilisateur ... mais nulle.

+3

publier votre code .... –

+0

Sans code, il est difficile de comprendre ce que vous voulez exactement à atteindre. –

+0

@SungRyongJo s'il vous plaît modifier votre question et lire l'aide pour la formation du code. Ne publiez pas votre code dans les commentaires. –

Répondre

0

AsyncTask est en arrière-plan si vous êtes en train de faire comme ce

// background process started 
new AsncTaskClass.execute(); 
//you are getting value from static variable, 
//this line will be executed immediately after execute `AsyncTask` it will not wait while finish so you will get `null` value 
String value = AsncTaskClass.ABC; 

pour votre solution, vous devez utiliser abstraite ou d'une interface pour obtenir la valeur après postExecute voir Exemple:

classe AsyncTask

public abstract class DemoAsync extends AsyncTask<Void, Void, Void> { 
@Override 
    protected Void doInBackground(Void... voids){ 
     return null; 
    } 
@Override 
    protected void onPostExecute(Void result) { 
     onGetValue(pass value here); 
    } 

    public abstract void onGetValue(String value);//Create an `abstract` method in AsyncTask class 

    } 

maintenant au-dessus de la classe appellent que vous avez fait comme

new DemoAsync() { 
    @Override 
    public void onGetValue(String value) { 
      //you will get this implemented method 
      // TO do something here, hurray you got value! 
    } 
}.execute(); 
0

HI Je posterai mon code exemple ci-dessous s'il vous plaît lire et essayer.

public class MainActivity extends AppCompatActivity { 
 

 
    static String globalString; 
 
    TextView hello; 
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 
     hello = (TextView) findViewById(R.id.textView1); 
 
     new asyncclass().execute(""); 
 
    } 
 
    private class asyncclass extends AsyncTask<String,String,String>{ 
 
     @Override 
 
     protected String doInBackground(String... params) { 
 
      try { 
 
       Thread.sleep(3000); 
 
      } catch (InterruptedException e) { 
 
       e.printStackTrace(); 
 
      } 
 
      return "New message for Hello word"; 
 

 
     } 
 

 
     @Override 
 
     protected void onPostExecute(String s) { 
 
      super.onPostExecute(s); 
 
      globalString = s; 
 
      hello.setText(globalString); 
 
     } 
 
    } 
 
}

+0

Je presse Log et je prends un résultat comme "sur une référence d'objet null" à propos de ProjectSpinner. Donc, je pense, si thread travail surPost ~~, variable initialize automatique ... alors le thread UI (thread principal) ne reconnaît pas ProjectSpinner. Donc, cela a juste une valeur nulle. droite? – SungRyongJo

+0

Sur PostExecute et onPreExecute, tous deux s'exécutent sur le thread principal de l'interface utilisateur. –