如何使用另一个按钮执行一个活动?

问题描述:

如何在另一个内部执行一个活动,而无需执行? 我的意思是,我有我的MainActivity其中我从ReadFromAssetActivity意图获得一些int数组。但要获得这些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

你的意图的实现几乎没有什么纯粹的Android的方式来做事。您不需要单独的'ReadFromAssetActivity'或任何其他活动来运行您的AsyncTask。最好的办法是将您的ReadFromAsset放入MainActivity中,并从openChart方法中调用。在回调界面中从AsyncTask获取int数组。

如果您的任务实际上比您在此代码段中向我们展示的方式复杂得多,请考虑为此使用IntentService的可能性。

让你ReadFromAsset任务一个单独的类(不是内部类的活动),并把它存储阵列作为其“结果”。还要给任务一种记住“侦听器”的方法,以便.onPostExecute()可以将这些数组发送回侦听器(在本例中为您的主要活动)。 我会列举一个通用示例,但我在移动设备上,并且已经有很多示例。编辑:一个例子:

/* 
* 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) ; 
    } 
} 

只要能使你的ReadFromAssetActivity一个公共静态方法。现在你可以在那里添加你需要的东西。您可以根据您的要求调用该方法并从主要活动执行。