2013-10-20 32 views
0

我想滚动到1000行的字符串中的子字符串。我注意到滚动和UI线程中的滞后。所以我想使用一个AsyncTask,但作为它的执行,我得到的文本,但不滚动。这里是我的代码滚动在AsyncTask中不工作

private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      SharedPreferences score = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
      int chapter_number_bookmark = score.getInt("chapter_number", 89); 
      int verse_number_bookmark = score.getInt("verse_number", 1); 
      GoToFunction(chapter_number_bookmark,verse_number_bookmark); 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText(getApplicationContext(), "Executed", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 

的GoToFunction

public void GoToFunction(int chapter, int verse) 
    { 
     int scroll_amt; 
     final TextView shw = (TextView) findViewById(R.id.textViewTab); 
     SharedPreferences score = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     int chapter_number = chapter; 
     int verse_number = verse; 
     String verse_number_str = Integer.toString(verse_number); 
     SQLiteDatabase as = openOrCreateDatabase("/"+Environment.getExternalStorageDirectory().getPath()+"/tamil/verse", MODE_PRIVATE, null); 
     Cursor a = as.rawQuery("select * from verse"+chapter_number, null); 
     a.moveToFirst(); 
     strTitle = a.getString(a.getColumnIndex("title")); 
     final String strContent_book = a.getString(a.getColumnIndex("content")); 
     int number = a.getInt(a.getColumnIndex("dialogues")); 
     tab.setText("\n\n "+strAthi+strTitle+"\n\n "+strVasa+number+"\n\n "+strContent_book); 
     final int offset_dot = strContent_book.indexOf(verse_number_str_dot); 
     final int offset_comma = strContent_book.indexOf(verse_number_str_comma); 
     a.close(); 
     as.close(); 
     if(offset_comma!=-1||offset_dot!=-1) 
     { 
      if(offset_comma==-1||(offset_dot<offset_comma)) 
      { 
      try 
      { 
      Toast.makeText(getApplicationContext(), "Athiyayam : "+ chapter_number +" Verse : "+ verse_number, Toast.LENGTH_LONG).show(); 
      **scroll(offset_dot); //Scroll function** 
      } 
      catch(Exception e) 
      { 
       Log.e("Scroll_comma", "Exception", e); 
      } 
      } 
      else 
      { 
       try 
       { 
       Toast.makeText(getApplicationContext(), "Athiyayam : "+ chapter_number +" Verse :"+ verse_number, Toast.LENGTH_LONG).show(); 
       scroll(offset_comma); 
       } 
       catch(Exception e) 
       { 
        Log.e("Scroll", "Exception", e); 
       } 
      } 
     } 
     else 
     { 
      Toast.makeText(getApplicationContext(), "Not found", Toast.LENGTH_LONG).show(); 
     } 
    } 

滚动功能

public void scroll(final int a) 
    { 
     final TextView shw = (TextView) findViewById(R.id.textViewTab); 
     try 
     { 
     mScroll.post(new Runnable() { 
      @Override 
      public void run() { 
       int y = shw.getLayout().getLineForOffset(a); // e.g. I want to scroll to line 40 
       int n = shw.getLayout().getLineTop(y); 
       mScroll.scrollTo(0, n); 
      } 
     }); 
     } 
     catch(Exception e) 
     { 
     Log.e("scroll", "error", e); 
     } 
    } 

这里我得到的文本。但滚动功能没有得到执行。此外,我希望做一个微调活动作为书签活动开始和结束,因为它最终可以在PreExecute和PostExecute

回答

0

来完成这个代码粘贴到您的布局:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"  
    > 

      <!-- "your layout" --> 

</ScrollView> 
+0

我不认为有滚动视图的问题。它工作正常。当我执行后台任务时,它不滚动。 – xtreak

+0

对不起,我英文不好! – javadaskari

0

从你的代码中尝试从doInBackground更新主线程。

 @Override 
     protected String doInBackground(String... params) { 
       .... 
      GoToFunction(chapter_number_bookmark,verse_number_bookmark); 
      ..... 
     } 

你不能那样做。我相信你在logcat中得到Exception。如果你想反正更新,做到这一点通过处理器

比方说我们有

private TextView m_txtLog;  
private ScrollView m_sv; 

那么滚动到最后一行应该是这样的:

m_sv.post(new Runnable() { 
    public void run() { 
    m_sv.scrollTo(0, m_txtLog.getHeight());     
    } 
    }); 

如果从Service运行或AsyncTask使用Handler例如:

static final int LOG_MSG = 1; 

private Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      String txt; 
      switch (msg.what) { 
      case LOG_MSG: 
       txt = msg.obj.toString(); 
       m_txtLog.append(txt); 

       m_sv.post(new Runnable() { 
        public void run() { 
         m_sv.scrollTo(0, m_txtLog.getHeight());     
        } 
       });  
       break; 
      default: 
       super.handleMessage(msg); 
      } 
     } 
    }; 

现在我们可以从AsyncTask写:

mHandler.sendMessage(mHandler.obtainMessage(LOG_MSG, "Agent started" + "\n\n")); 

正如你可以看到scrollTo包裹的处理程序。通过这种方式它会工作。

(测试)

+0

我想滚动到一个特定的线..滚动工作正常,没有AsyncTask较小的行。当我得到1000行时,我注意到了一个延迟,所以我放入了AsyncTask,它执行设置文本但不滚动的过程。 – xtreak

+0

您是否尝试过使用Handler? –

+0

不,我努力尝试。我dono如何使用它.. – xtreak

0

使用用于滚动的AsyncTask真的不是在这种情况下必要的。你可以简单地在主线程中运行代码。它会正常工作。
,因为如果用户在用asyntask滚动时单击滚动视图。会有意想不到的行为。
并指定
1.滚动型
2.您的活动清单android:hardwareAccelerated="true"除了上述步骤 - scrollView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
这将使用硬件加速滚动型的平滑滚动。