从另一个活动运行AsyncTask

时间:2017-04-04 10:19:30

标签: java android android-asynctask

我的启动器活动中有一个按钮是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来解决这个问题。

4 个答案:

答案 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)

您的代码中存在错误。

  1. 班级名称不能与MainActivity.doit

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

  4. 未在清单中声明MainActivity.doit。

  5. 因此将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);

上述代码将假定子类doitActivity并尝试启动它。崩溃说明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