2016-02-19 1 views
0

Как выполнить одно действие внутри другого, не прибегая к нему? Я имею в виду, у меня есть MainActivity, где я получаю некоторые массивы int от ReadFromAssetActivity с намерением. Но для получения этих массивов int мне нужно выполнить ReadFromAssetActivity на первом месте, а затем перейти на MainActivity и выполнить его. Я хочу нажать кнопку в MainActivity, которая выполняет ReadFromAssetActivity без необходимости перехода к этой операции.Как выполнить действие с помощью кнопки внутри другого?

MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Getting reference to the button btn_chart 
     Button btnChart = (Button) findViewById(R.id.btn_chart); 

     // Defining click event listener for the button btn_chart 
     View.OnClickListener clickListener = new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Draw the Chart 
       openChart(); 
      } 
     }; 

     // Setting event click listener for the button btn_chart of the SensorGraph layout 
     btnChart.setOnClickListener(clickListener); 

    } 

    private void openChart() { 

     Intent intent = getIntent(); 

     int[] force_l = intent.getIntArrayExtra("force_l"); 
     int[] force_r = intent.getIntArrayExtra("force_r"); 
     int[] x = new int[force_l.length]; 
(...) 

ReadFromAssetActivity:

public class ReadFromAssetActivity extends AppCompatActivity { 
    private Button read_Button; 
    int[] force_l = null; 
    int[] force_r = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_read_from_asset); 

     initializeUI(); 
    } 

    private void initializeUI() { 
     read_Button = (Button) findViewById(R.id.ReadFromAssetActivity_start_reading_button); 
     read_Button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new ReadFromAsset().execute(); 
      } 
     }); 
    } 

    private class ReadFromAsset extends AsyncTask<Void, Void, Void> { 

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

       BufferedReader reader = new BufferedReader(
         new InputStreamReader(getAssets().open("test.txt"))); 
       String mLine = null; 
       int count = 0; 
       while ((mLine = reader.readLine()) != null) { 
        String[] integer_Strings = mLine.split(" "); 
        //System.out.println(Arrays.deepToString(integer_Strings)); 
        if (count == 0) { 
         force_l = new int[integer_Strings.length]; 
         for (int i = 0; i < integer_Strings.length; i++) { 
          force_l[i] = Integer.parseInt(integer_Strings[i]); 
         } 
         count++; 
        } else if (count == 1) { 
         force_r = new int[integer_Strings.length]; 
         for (int i = 0; i < integer_Strings.length; i++) { 
          force_r[i] = Integer.parseInt(integer_Strings[i]); 
         } 
        } 

       } 

       Intent intent = new Intent(ReadFromAssetActivity.this, MainActivity.class); 
       intent.putExtra("force_l", force_l); 
       intent.putExtra("force_r", force_r); 
       startActivity(intent); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
     } 
    } 
} 
+0

то почему вы не ставите свой обязательный код в 'MainActivity'? – starkshang

ответ

2

То, что вы намерены достичь вряд ли чистый Android способ делать вещи. Вам не нужно отдельное «ReadFromAssetActivity» или любое другое действие для запуска AsyncTask. Лучше всего было бы поместить ваш ReadFromAsset в вашу MainActivity и вызвать из вашего метода openChart. Получите ваши int массивы из AsyncTask в интерфейсе обратного вызова.

Если ваша задача на самом деле сложнее, чем вы показываете нам в этом фрагменте, пожалуйста, рассмотрите возможность использования IntentService для этого.

1

Задайте свой класс ReadFromAsset отдельным классом (а не внутренним классом активности) и сохраните его как «результат». Также дайте задаче способ запомнить «слушателя», чтобы .onPostExecute() мог отправить эти массивы обратно слушателю (в данном случае, вашему основному действию). Я бы набрал общий пример, но я нахожусь на мобильном телефоне, и в нем уже много примеров.EDIT: Пример:

/* 
* This consumer could be anything -- an activity, a service, a data 
* object, whatever. All it needs to do is implement the task's 
* listener interface. 
*/ 
public class Example 
implements MyTask.Listener 
{ 
    // other code 

    public void doThings() 
    { 
     (new MyTask()).setListener(this) 
      .setInputFile("flargle.txt") 
      .execute() 
      ; 
    } 

    /** Specified by MyTask.Listener, called by MyTask#onPostExecute() */ 
    public void onMyTaskComplete(MyTaskResult res) 
    { 
     // Do something with the result. 
    } 
} 

public class MyTaskResult 
{ 
    // Stores whatever complex data you want the task to create. 
    // Necessary only if what you're creating is really complex. 
} 

public class MyTask extends AsyncTask<Void,Void,MyTaskResult> 
{ 
    public interface Listener 
    { 
     void onMyTaskComplete(MyTaskResult res) ; 
    } 

    protected Listener m_lstn ; 
    protected String m_sFilename ; 

    public MyTask setListener(Listener lstn) 
    { 
     m_lstn = lstn ; 
     return this ; 
    } 

    public MyTask setInputFile(String sFilename) 
    { 
     m_sFilename = sFilename ; 
     return this ; 
    } 

    @Override 
    public MyTaskResult doInBackground(Void... aNulls) 
    { 
     MyTaskResult res = new MyTaskResult() ; 
     // Do stuff that produces a MyTaskResult. 
     return res ; 
    } 

    @Override 
    public void onPostExecute(MyTaskResult res) 
    { 
     m_lstn.onMyTaskCompleted(res) ; 
    } 
} 
0

Просто сделать публичный статический метод в вашем ReadFromAssetActivity. Теперь вы можете добавить туда то, что вам нужно. Вы можете вызвать этот метод и выполнить из основного действия в соответствии с вашим требованием.

Смежные вопросы