2014-12-05 74 views
2

我一直在尝试实现片段布局,并在其中一个片段类中使用asynctask。 到目前为止,我无法从片段的oncreateView调用asynctask方法。 当我运行的应用程序及其给错误“不幸的是,应用程序已经停止”从片段的onCreateView调用AsyncTask方法,失败

这里是我的片段代码

package com.example.mohamed.myapplication; 

import java.io.File; 
import java.io.IOException; 

import org.jsoup.Connection; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Attributes; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

import android.app.ActionBar; 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v13.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ListView; 


import java.util.Locale; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class FirstFragment extends Fragment { 

    // URL Address 
    String url = "http://www.androidbegin.com"; 
    ProgressDialog mProgressDialog; 
    AsyncTask aTask; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

     new Title().execute(); 

     View rootView = inflater.inflate(R.layout.first_frag, container, false); 
     return rootView; 

    } 


    // Title AsyncTask 
    private class Title extends AsyncTask<Void, Void, Void> { 
     String title; 

//  Context mcontext; 
//  public Title(Context c){ 
//   mcontext=c; 
//  } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
//    mProgressDialog = new ProgressDialog(mcontext); 
//    mProgressDialog.setTitle("Android Basic JSoup Tutorial"); 
//    mProgressDialog.setMessage("Loading..."); 
//    mProgressDialog.setIndeterminate(false); 
//    mProgressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       // Connect to the web site 
       Document document = Jsoup.connect(url).get(); 
       // Get the html document title 
       title = document.title(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // Set title into TextView 
      TextView txttitle = (TextView) getView().findViewById(R.id.First); 
      txttitle.setText(title); 
      mProgressDialog.dismiss(); 
     } 
    } 

    public static FirstFragment newInstance(String text) { 

     FirstFragment f = new FirstFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 

    } 

} 

那么,什么是调用的AsyncTask的正确方法?

,这里是我的logcat

12-01 14:44:40.052 1093-1093/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed 49K, 3% free 3755K/3868K, paused 2ms, total 4ms 
12-01 14:44:40.056 1093-1093/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed 3K, 3% free 3973K/4092K, paused 2ms, total 2ms 
12-01 14:44:40.064 1093-1093/com.example.mohamed.myapplication I/dalvikvm-heap﹕ Grow heap (frag case) to 6.356MB for 2536932-byte allocation 
12-01 14:44:40.072 1093-1103/com.example.mohamed.myapplication D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 2% free 6450K/6572K, paused 5ms, total 5ms 
12-01 14:44:40.180 1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so 
12-01 14:44:40.180 1093-1093/com.example.mohamed.myapplication D/﹕ HostConnection::get() New Host Connection established 0xb8a8f1c0, tid 1093 
12-01 14:44:40.184 1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
12-01 14:44:40.184 1093-1093/com.example.mohamed.myapplication D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so 
12-01 14:44:40.224 1093-1093/com.example.mohamed.myapplication W/EGL_genymotion﹕ eglSurfaceAttrib not implemented 
12-01 14:44:40.224 1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache 
12-01 14:44:40.228 1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192 
12-01 14:44:40.232 1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
12-01 14:44:40.232 1093-1093/com.example.mohamed.myapplication E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192 
12-01 14:44:40.236 1093-1093/com.example.mohamed.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0 
+0

你的代码在哪里调用'AsyncTask'?并请张贴'logcat' – 2014-12-05 13:53:53

+0

@BlazeTama新标题().exec()在onCreateView – Suvitruf 2014-12-05 13:55:14

+0

ups对不起,我的眼睛滑落 – 2014-12-05 13:57:01

回答

2

您试图创建视图之前在onCreateView使用AsyncTask

试图调用的AsyncTask在onActivityCreated

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    new Title().execute(); 
} 
+0

问题在于这一行。 'mProgressDialog.dismiss();'我刚刚评论过这一行,并从onActivityCreated调用了AsyncTask。最后问题解决了。谢谢大家的帮助 – 2014-12-06 05:28:28

2

我认为问题就出在这行:

TextView txttitle = (TextView) getView().findViewById(R.id.First); 

删除线,并在onCreateView加入这一行:

txttitle = (TextView) rootview.findViewById(R.id.First); 

使txttitle成为一个全局变量。

后,在onActivityCreated

1

你在你的代码中的竞争条件执行AsyncTask。您从onCreateView()方法开始Title,方法是在返回rootView之前。因此,如果AsyncTask在之前执行并完成了Fragment已成功运行到运行状态,那么您的onPostExecute()中将不会从getView()中收到任何内容。此外,代码不会显示何时启动对话框,因此您可以在尝试访问mProgressDialog时获得NullPointerException

顺便说一下,你的logat是不完整的:它缺少实际的崩溃堆栈跟踪。找到它,它会告诉你到底发生了什么异常。