2017-04-04 62 views
-1

我在发射活动有一个按钮,这是menu.java,当我点击按钮,说我希望它加载其他活动MainActivity.java和说actvity运行的AsyncTask,而无需单击另一个按钮。从另一个活动运行的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; 
    } 


} 
} 

的事情是,当我点击它加载在MainActivity的menu.java的按钮,但它并不直接运行的AsyncTask,它只是崩溃。我新编码,任何意见将非常感激。

编辑:通过创建一个新类并在那里实现AsyncTask来解决这个问题。

+1

'它只是crashes'。你的崩溃日志是什么? – pooyan

+0

在MainActivity的oncreate中调用asynctask ..在你的MainActivity代码中崩溃的地方 – sravs

+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); 

,并致电AsyncTaskMainActivityonCreate()方法里面像

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new doitTask().execute(); 
} 
1

我会尝试用提供的信息回答这个问题。我认为你想要做的事情是不可能的,或者只是非常糟糕的做法。我猜测MainActivity的AsyncTask试图与MainActivity的接口进行通信,而不能。相反,你应该做的是在MainActivity的onCreate中启动AsyncTask,并根据bundle extras启动它,它不应该崩溃,或者你没有提供的AsyncTask有问题。

祝你好运!

+0

好吧,我会尝试 –

1

您的代码存在错误。

  1. 类名称不能像MainActivity.doit

  2. 中有case语句没有中断。您尝试启动MainActivity活动,然后MainActivity.doit

  3. MainActivity.doit没有在清单中声明。

因此,将MainActivity.doit重命名为manifest,并在manifest中声明并将case语句更改为following。

case R.id.beis: 
     Intent intent1 = new Intent(this, MainActivity.class); 
     startActivity(intent1); 
     break; 
+0

是的,我做到了。活动加载正常,其asynctask不加载的活动。 –

+0

没有您的日志猫明确表示您尚未宣布清单中的活动 – sravs

+0

已更新我的回答请检查 – sravs

1

很多东西在你的代码中是根本错误的......我会尽力涵盖最重要的部分。

Intent myIntent = new Intent(this, MainActivity.doit.class); 
startActivity(myIntent); 

上述码将假定子类doit是一个Activity并尝试启动它。该崩溃说明您的AndroidManfest.xml文件中没有声明主动活动。


new MainActivity.doit().execute(); 

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


正确处理这种情况很大程度上取决于您正在尝试做什么。如果doitMainActivity无关,我建议将它在单独的类中移出。如果有事情做非常具体的MainActivity,您可以在几件事情传递到自己的AsyncTask像一个参数:

new DoIt().execute(lblMyLabel); 

或者你可以保持它在MainActivity,因为它是,但开始它的基础上一些Extra由@jobbert建议,如果Activity尚未启动,那就是。

据我来说,最好的办法是在你的MainActivity搬出DOIT作为一个完全不同的类,并在听众传递(实现自己的自定义界面),并处理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); 
    } 
}); 
相关问题