从另一个活动运行异步任务



我的启动器活动中有一个按钮,它是菜单.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);

并在MainActivityonCreate()方法中调用您的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 有问题。

祝你好运!

你的代码中有错误。

  1. 类名不能像 MainActivity.doit

  2. 案例陈述中没有中断。 您正在尝试启动 MainActivity 活动,然后启动 MainActivity.doit

  3. 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文件中没有声明ActivityMainActiviy.doit


new MainActivity.doit().execute();

此代码将创建类MainActivity的新实例并执行其doitAsyncTask。此实例将与用户可见Activity不同,它是一个完全不同的实例。


正确处理这种情况在很大程度上取决于您到底要做什么。如果doitMainActivity无关,我建议将其移到单独的类中。如果它与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);
} 
});

最新更新