2014-12-05 4 views
2

Я пытаюсь реализовать макет фрагмента, и в одном из классов фрагментов я использую asynctask. до сих пор я не могу вызвать метод asynctask из oncreateView фрагмента. , когда я запустить приложение его дает ошибку «к сожалению, приложение остановилось»вызов метода AsyncTask из onCreateView фрагмента, сбой

здесь код моего фрагмента

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' –

+0

@BlazeTama new Title(). Execute() в onCreateView – Suvitruf

+0

ups извините, мои глаза скользнули –

ответ

2

Вы пытаетесь использовать AsyncTask в onCreateView перед тем зрения создания.

Попытка вызвать AsyncTask в onActivityCreated:

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

проблема была с этой линией. 'mProgressDialog.dismiss();' Я просто прокомментировал эту строку и назвал AsyncTask из onActivityCreated. Наконец, проблема решена. Спасибо всем за помощь –

2

Я думаю, что проблема заключается в этой строке:

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

Удалить эту строку, и добавить эту строку в onCreateView:

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

Сделать глобальную переменную txttitle.

После этого выполнить AsyncTask в onActivityCreated

1

у вас есть условие гонки в вашем коде. Вы начинаете Title от вас onCreateView() метод, прежде чем он вернет rootView. Итак, если AsyncTask выполняет и завершает до, то Fragment успешно доставлен в рабочее состояние, вы ничего не получите от getView() в своем onPostExecute(). Кроме того, код не отображается при запуске диалога, поэтому вместо попытки получить доступ к mProgressDialog вы можете получить NullPointerException.

BTW, ваш логит неполный: отсутствует фактическая разбивка стека. Посмотрите на это, и он скажет вам, где именно происходит ваше исключение.

Смежные вопросы