我的启动器活动中有一个按钮,它是菜单.java当我单击该按钮时,我希望它加载其他活动 MainActivity.java并在所述活动中运行 AsyncTask,而无需单击另一个按钮。
这是我的菜单.java活动:
package davidgb.baseballspain;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
public class Menu extends ActionBarActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button beis = (Button) findViewById(R.id.beis);
beis.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.beis:
Intent intent1 = new Intent(this, MainActivity.class);
startActivity(intent1);
Intent myIntent = new Intent(this, MainActivity.doit.class);
startActivity(myIntent);
//new MainActivity.doit().execute();
break;
default:
break;
}
}
}
问题是当我单击菜单中的按钮时.java它会加载 MainActivity,但它不会直接运行 AsyncTask,它只是崩溃。我是编码新手,任何建议将不胜感激。
编辑:通过创建一个新类并在那里实现 AsyncTask 来解决此问题。
为什么你打电话给下面
Intent myIntent = new Intent(this, MainActivity.doit.class);
startActivity(myIntent);
break;
它认为MainActivity.doit.class
也是一种活动。当您的活动处于MainActivity
时
只需将以下行放在按钮单击中即可
Intent intent1 = new Intent(this, MainActivity.class);
startActivity(intent1);
并在MainActivity
onCreate()
方法中调用您的AsyncTask
,例如
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new doitTask().execute();
}
我将尝试使用提供的信息来回答这个问题。我认为你想做的事情是不可能的,或者只是非常糟糕的做法。我猜 MainActivity 的 AsyncTask 正在尝试与 MainActivity 的接口进行通信,但它无法通信。相反,你应该做的是在 MainActivity 的 onCreate 中启动 AsyncTask,并根据捆绑额外内容启动它,它不应该崩溃,或者你没有提供的 AsyncTask 有问题。
祝你好运!
你的代码中有错误。
-
类名不能像 MainActivity.doit
-
案例陈述中没有中断。 您正在尝试启动 MainActivity 活动,然后启动 MainActivity.doit
-
MainActivity.doit 未在清单中声明。
因此,将 MainActivity.doit 重命名为其他名称,并在清单中声明并将 case 语句更改为以下内容。
case R.id.beis:
Intent intent1 = new Intent(this, MainActivity.class);
startActivity(intent1);
break;
你的代码中的很多东西从根本上都是错误的......我将尝试涵盖最重要的部分。
Intent myIntent = new Intent(this, MainActivity.doit.class);
startActivity(myIntent);
上述代码将假定子类doit
是一个Activity
并尝试启动它。崩溃表明您的AndroidManfest.xml
文件中没有声明Activity
MainActiviy.doit。
new MainActivity.doit().execute();
此代码将创建类MainActivity
的新实例并执行其doitAsyncTask
。此实例将与用户可见Activity
不同,它是一个完全不同的实例。
正确处理这种情况在很大程度上取决于您到底要做什么。如果doit与MainActivity
无关,我建议将其移到单独的类中。如果它与MainActivity
有非常具体的事情,你可以在AsyncTask
中传入一些参数,例如:
new DoIt().execute(lblMyLabel);
或者,您可以按原样将其保留在MainActivity
中,但如果Activity
尚未启动,则可以根据@jobbert建议的某些Extra
启动它。
根据我的说法,最好的方法是将doit作为一个完全不同的类移出,并传入一个侦听器(您自己的自定义接口的实现)并在您的MainActivity
中处理UI内容。像这样:
public class DoSomething {
public static void doIt(final MyListener listener) {
new AsyncTask<Void, Void, String>() {
public String doInBackground(Void... params) {
return "Something is done here";
}
public void onPostExecute(String result) {
super.onPostExecute(result);
listener.onDone(result);
}
}.execute();
}
public interface MyListener {
public void onDone(String result);
}
}
并从您的MainActivity
或其他任何地方调用它,例如:
DoSomething.doIt(new DoSomething.MyListener() {
Override
public void onDone(String result) {
lblHelloWorld.setText(result);
}
});