我的启动器活动中有一个按钮是menu.java,当我点击所述按钮时,我希望它加载其他活动MainActivity.java并在所述活动中运行AsyncTask而无需单击另一个按钮。
这是我的menu.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;
}
}
}
当我单击menu.java中的按钮时,它会加载MainActivity,但它不会直接运行AsyncTask,它只会崩溃。我是编码新手,任何建议都会非常感激。
编辑:通过创建一个新类并在那里实现AsyncTask来解决这个问题。
答案 0 :(得分:2)
你为什么要打电话给下面的
Intent myIntent = new Intent(this, MainActivity.doit.class);
startActivity(myIntent);
break;
它认为MainActivity.doit.class
也是一项活动。您的活动为MainActivity
只需在按钮中单击以下行
即可Intent intent1 = new Intent(this, MainActivity.class);
startActivity(intent1);
并在AsyncTask
MainActivity
方法中调用onCreate()
,如
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new doitTask().execute();
}
答案 1 :(得分:1)
我会尝试用提供的信息回答这个问题。我认为你要做的事情是不可能的,或者只是非常糟糕的做法。我猜测MainActivity的AsyncTask正在尝试与MainActivity的接口进行通信,但它无法实现。相反,你应该做的是在MainActivity的onCreate中启动AsyncTask,并根据bundle extras启动它,它不应该崩溃,或者你提供的AsyncTask有问题。
祝你好运!答案 2 :(得分:1)
您的代码中存在错误。
班级名称不能与MainActivity.doit
案例陈述没有中断。您正尝试启动MainActivity活动,然后启动MainActivity.doit
未在清单中声明MainActivity.doit。
因此将MainActivity.doit重命名为其他名称并在清单中声明并将case语句更改为以下内容。
case R.id.beis:
Intent intent1 = new Intent(this, MainActivity.class);
startActivity(intent1);
break;
答案 3 :(得分:1)
您的代码中的很多内容都是根本错误的......我会尝试覆盖最重要的部分。
Intent myIntent = new Intent(this, MainActivity.doit.class);
startActivity(myIntent);
上述代码将假定子类doit
为Activity
并尝试启动它。崩溃说明Activity
文件中没有声明AndroidManfest.xml
MainActiviy.doit 。
new MainActivity.doit().execute();
此代码将创建类MainActivity
的新实例并执行其 doit AsyncTask
。此实例与用户可见的Activity
不同,它是完全不同的实例。
正确处理此案例将在很大程度上取决于您的具体操作。如果 doit 与MainActivity
无关,我建议将其移出另一个类。如果它具有针对MainActivity
的特定内容,您可以将AsyncTask
中的一些内容作为参数传递给:
new DoIt().execute(lblMyLabel);
或者您可以将其保留在MainActivity
中,但如果Extra
尚未启动,则根据@jobbert建议的某些Activity
启动它。
据我所知,最好的方法是将 doit 作为一个完全不同的类移出并传入一个监听器(实现自己的自定义界面)并在你的{处理UI内容{1}}。类似的东西:
MainActivity
然后从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